Pytanie Kiedy w renderingu AngularJS wywoływana jest funkcja $ render ngModel?


W tym oficjalnym przykładzie, co robi poniższy kod?

// model -> view
ctrl.$render = function() {
  elm.html(ctrl.$viewValue);
};

O ile widzę, $render nigdy nie jest wywoływany.

Gdy $render jest rzeczywiście nazywany?


AKTUALIZACJA

Wygląda jak $render jest wywoływana za każdym razem, gdy model się zmienia. Ale nie jest wywoływana, gdy model otrzymuje wartość początkową. Czy istnieje sposób kontrolowania renderowania wartości początkowej?


21
2018-01-13 03:46


pochodzenie




Odpowiedzi:


Dobrze $render jest wywoływany przez Angular, gdy model się zmienia. Według $ renderowanie dokumentów:

$ render ()

Wywoływane, gdy widok wymaga aktualizacji. Oczekuje się, że użytkownik   dyrektywy ng-model wdroży tę metodę.

Warto zobaczyć, jak to zrobić $render jest wywoływana ngModelWatch (która jest wywoływana, gdy tylko ngModel zmiany). Tutaj widzimy $formatters nazywany, a następnie $viewValue zaktualizowane i nareszcie $render jest nazywany:

$scope.$watch(function ngModelWatch() {
    var value = ngModelGet($scope);

    // if scope model value and ngModel value are out of sync
    if (ctrl.$modelValue !== value) {

      var formatters = ctrl.$formatters,
          idx = formatters.length;

      ctrl.$modelValue = value;
      while(idx--) {
        value = formatters[idx](value);
      }

      if (ctrl.$viewValue !== value) {
        ctrl.$viewValue = value;
        ctrl.$render();
      }
    }

    return value;
  });
}];

Powód, dla którego nie jest wywołana wartość początkowa ze względu na tę linię na końcu dyrektywy:

// load init value from DOM
ctrl.$setViewValue(elm.html());

To ręcznie aktualizuje wartość widoku bez wyzwalania ngModelWatch() i dlatego bez przechodzenia $formatters lub $render. Jeśli zamiast tego linia była:

scope.content=elm.html();

Zobaczysz $render zwany przez Angulara, ponieważ to spowodowałoby $watch


27
2018-01-13 04:29



Dzięki za szczegółowe wyjaśnienie! Czy mógłbyś wyjaśnić dlaczego tak się stało? ten przykład  $render nie jest wywoływana, gdy model się zmienia? - Misha Moroshko