Home Web Front-end JS Tutorial angular1 study notes, which contain the view model synchronization process in angularjs

angular1 study notes, which contain the view model synchronization process in angularjs

Sep 07, 2018 pm 05:28 PM
angularjs javascript

This is a personal understanding note of angularjs. Here is the synchronization process of the view model. Let me write it for everyone to see. Now let us enter this article together

The thing originated from a small problem encountered in the project: the project requires an input box to enter the quantity of products sold, and the handling fee is calculated based on the input data after the user inputs. Naturally I used ng-model and ng-change, and generally there is no problem. The problem is: there is a button under the input box to sell all. Clicking this button will automatically set the selling amount. But in fact, the program does not calculate the handling fee at this time.
After troubleshooting and consulting the documentation, I found that it was a problem with ng-change. Angular's official document about ng-change prompts:
The expression is not evaluated when the value change is coming from the model.
The source code of ng-change is also very simple:

  var ngChangeDirective = valueFn({
      restrict: 'A',
      require: 'ngModel',
      link: function(scope, element, attr, ctrl) {
        ctrl.$viewChangeListeners.push(function() {
          scope.$eval(attr.ngChange);
        });
      }
    });
Copy after login

From We can also see that ng-change only monitors the view to the model. So when we modify the variables of ng-model directly in js, ng-change will not be triggered.
The problem is found, and the solution is not difficult. Just abandon ng-change and use $watch instead.
But is this the end? What exactly does a variable go through from the view change to the synchronous update to the model? The other way around, is it the same?
So I took a look at the source code of ng-model again, and found nothing. However, I unexpectedly learned this:
ng-change is executed before the model value changes. There is such a function in the ng-model source code:

function setupModelWatcher(ctrl) {
  // model -> value
  // !!!Note: we cannot use a normal scope.$watch as we want to detect the following:
  // !!!1. scope value is 'a'
  // !!! 2. user enters 'b'
  // !!!3. ng-change kicks in and reverts scope value to 'a'
  //    -> scope value did not change since the last digest as
  //       ng-change executes in apply phase
  // !!!4. view should be changed back to 'a'
  ctrl.$$scope.$watch(function ngModelWatch(scope) {
    var modelValue = ctrl.$$ngModelGet(scope);

    // if scope model value and ngModel value are out of sync
    // This cannot be moved to the action function, because it would not catch the
    // case where the model is changed in the ngChange function or the model setter
    if (modelValue !== ctrl.$modelValue &&
      // checks for NaN is needed to allow setting the model to NaN when there's an asyncValidator
      // eslint-disable-next-line no-self-compare
      (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)
    ) {
      ctrl.$$setModelValue(modelValue);
    }

    return modelValue;
  });
}
Copy after login

The comments inside explain why the variable model value must be modified after ng-change, because the variable value is likely to be modified back in ng-change. , so that the variable value does not actually change (you really have to take all situations into consideration when writing an api!!). Regarding this and the previous questions, here is a demo code: http://php.cn/course/47.html

Since there is nothing to gain from looking at the source code, then go search for articles online. I found a good article during this process. This article introduces

$formatters,$parsers,$render and$setViewValue. I won’t introduce it here anymore. If you need to learn, the original text is here: http://php.cn/course/47.html

I also found one that is very easy when learning $setViewValue The pitfall: When calling $setViewValue, if the parameter is a reference variable, then if the reference variable address has not changed, the variable is considered unchanged, such as var map = ['er', 'tr '];Then $setViewValue does not think that the map value has changed after map.pop();. For details on this, please see my answer to this question. (If you want to know more, go to the PHP Chinese website AngularJS Development Manual to learn)

ng-model also has this problem, which can be seen in the ng-model source code comments:

However, custom controls might also pass objects to this method. In
this case, we should make a copy of the object before passing it to
$setViewValue. This is because ngModel does not perform a deep
watch of objects, it only looks for a change of identity.

If you only change the property of the object then ngModel will not
realize that the object has changed and will not invoke the $parsers
and $validators pipelines.

You can also see from the above that there is actually a variable There are more than $formatters and $parsers pipelines for updating from view to model and model to view, so what others are there?

After checking a lot of information, I found a very clear explanation: https://stackoverflow.com/que... In fact, you only need to read the answer to the question. The question is too long. . .
There is a demo link in this answer. I copied it and made small modifications and put it at this address: http://php.cn/course/47.html. This demo clearly shows the variable updates. The process will not be repeated in detail. Here we only summarize the results as follows:
From model to view:
Model value modification----> $formattersPipeline--- -> $renderfunction----> $validators ----> $watchfunction

From view to model:
view value modification----> $setViewValuefunction----> $parserspipeline----> $validators ----> $viewChangeListenerFunction----> $watchFunction
We can also directly call the $setViewValue function Directly change the value of $viewValue, the process will be the same as above.
Note that when using $setViewValue, you must be wary of parameters that refer to variables. This pitfall has also been mentioned above.

This article does not specifically introduce the $formatters and $parsers pipelines. For this part, you can refer to the link given in the article

Okay, this article ends here (if you want to see more, go to the PHP Chinese website AngularJS User Manual to learn). If you have any questions, you can leave a message below.

The above is the detailed content of angular1 study notes, which contain the view model synchronization process in angularjs. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to implement an online speech recognition system using WebSocket and JavaScript How to implement an online speech recognition system using WebSocket and JavaScript Dec 17, 2023 pm 02:54 PM

How to use WebSocket and JavaScript to implement an online speech recognition system Introduction: With the continuous development of technology, speech recognition technology has become an important part of the field of artificial intelligence. The online speech recognition system based on WebSocket and JavaScript has the characteristics of low latency, real-time and cross-platform, and has become a widely used solution. This article will introduce how to use WebSocket and JavaScript to implement an online speech recognition system.

WebSocket and JavaScript: key technologies for implementing real-time monitoring systems WebSocket and JavaScript: key technologies for implementing real-time monitoring systems Dec 17, 2023 pm 05:30 PM

WebSocket and JavaScript: Key technologies for realizing real-time monitoring systems Introduction: With the rapid development of Internet technology, real-time monitoring systems have been widely used in various fields. One of the key technologies to achieve real-time monitoring is the combination of WebSocket and JavaScript. This article will introduce the application of WebSocket and JavaScript in real-time monitoring systems, give code examples, and explain their implementation principles in detail. 1. WebSocket technology

How to use JavaScript and WebSocket to implement a real-time online ordering system How to use JavaScript and WebSocket to implement a real-time online ordering system Dec 17, 2023 pm 12:09 PM

Introduction to how to use JavaScript and WebSocket to implement a real-time online ordering system: With the popularity of the Internet and the advancement of technology, more and more restaurants have begun to provide online ordering services. In order to implement a real-time online ordering system, we can use JavaScript and WebSocket technology. WebSocket is a full-duplex communication protocol based on the TCP protocol, which can realize real-time two-way communication between the client and the server. In the real-time online ordering system, when the user selects dishes and places an order

How to implement an online reservation system using WebSocket and JavaScript How to implement an online reservation system using WebSocket and JavaScript Dec 17, 2023 am 09:39 AM

How to use WebSocket and JavaScript to implement an online reservation system. In today's digital era, more and more businesses and services need to provide online reservation functions. It is crucial to implement an efficient and real-time online reservation system. This article will introduce how to use WebSocket and JavaScript to implement an online reservation system, and provide specific code examples. 1. What is WebSocket? WebSocket is a full-duplex method on a single TCP connection.

JavaScript and WebSocket: Building an efficient real-time weather forecasting system JavaScript and WebSocket: Building an efficient real-time weather forecasting system Dec 17, 2023 pm 05:13 PM

JavaScript and WebSocket: Building an efficient real-time weather forecast system Introduction: Today, the accuracy of weather forecasts is of great significance to daily life and decision-making. As technology develops, we can provide more accurate and reliable weather forecasts by obtaining weather data in real time. In this article, we will learn how to use JavaScript and WebSocket technology to build an efficient real-time weather forecast system. This article will demonstrate the implementation process through specific code examples. We

How to use insertBefore in javascript How to use insertBefore in javascript Nov 24, 2023 am 11:56 AM

Usage: In JavaScript, the insertBefore() method is used to insert a new node in the DOM tree. This method requires two parameters: the new node to be inserted and the reference node (that is, the node where the new node will be inserted).

Simple JavaScript Tutorial: How to Get HTTP Status Code Simple JavaScript Tutorial: How to Get HTTP Status Code Jan 05, 2024 pm 06:08 PM

JavaScript tutorial: How to get HTTP status code, specific code examples are required. Preface: In web development, data interaction with the server is often involved. When communicating with the server, we often need to obtain the returned HTTP status code to determine whether the operation is successful, and perform corresponding processing based on different status codes. This article will teach you how to use JavaScript to obtain HTTP status codes and provide some practical code examples. Using XMLHttpRequest

How to get HTTP status code in JavaScript the easy way How to get HTTP status code in JavaScript the easy way Jan 05, 2024 pm 01:37 PM

Introduction to the method of obtaining HTTP status code in JavaScript: In front-end development, we often need to deal with the interaction with the back-end interface, and HTTP status code is a very important part of it. Understanding and obtaining HTTP status codes helps us better handle the data returned by the interface. This article will introduce how to use JavaScript to obtain HTTP status codes and provide specific code examples. 1. What is HTTP status code? HTTP status code means that when the browser initiates a request to the server, the service

See all articles