AgnualrJs - разница между $ parsers.unshift и $ parsers.push - PullRequest
0 голосов
/ 26 мая 2018

Какая точная разница между ngModelCtrl.$parsers.unshift и ngModelCtrl.$parsers.push в пользовательской директиве.

Я хочу заставить angular проверять форму, когда что-то происходит, что влияет на model, но не на formсам.Я пытался установить Form.$setSubmitted, но я знаю, что это не так.после нескольких поисков я обнаружил, что в моей пользовательской директиве валидации нужно использовать что-то вроде ngModelCtrl.$parsers.unshift.

моя директива обязана проверять длину массива, привязанного к ng-model:

return {
        restrict: 'A',
        require: 'ngModel',
        link: function ($scope, elem, attrs, ngModelCtrl) {

            ngModelCtrl.$parsers.push(function (viewValue) {
                // doesn't enter this function at all!
                console.log(viewValue);
            });

            ngModelCtrl.$validators.requiredCount = function (modelValue, viewValue) {
                // executed at the first time only at initialize
                return modelValue.length == attrs.requiredCount;
            };
        }
    };

и как я его использую:

<list orientation="vertical" type="PropertyValue" ng-model="Entity.PropertyValues" 
          dont-save 
          ng-required="PropertyTypeIdObject.Code === 'FixedValues'"
          required-count="1"></list>

list сама по себе является директивой, отвечающей за обработку массива, связанного с ng-model.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Из Документация синтаксического анализатора parsers - это Array of functions

Массив функций для выполнения в виде конвейера всякий раз, когда элемент управления обновляет ngModelController с новым $ viewValueиз DOM, обычно через пользовательский ввод.Смотрите $ setViewValue () для подробного объяснения жизненного цикла.Обратите внимание, что $ парсеры не вызываются, когда связанное выражение ngModel изменяется программно.

Функции вызываются в порядке массива, каждая из которых передает свое возвращаемое значение следующему.Последнее возвращаемое значение передается в коллекцию $ validators.

, поэтому в вашем коде

 ngModelCtrl.$parsers.push(function (viewValue) {
      // doesn't enter this function at all!
      console.log(viewValue);
 });

Вы отправляете новый function в массив parsers впроверьте ngModel controller

Теперь разница между unshift и push:

  1. Unshift и shift makeвесь сдвиг массива sideways (путем добавления и удаления элементов в начале)
  2. Push и pop НЕ заставляют массив сдвигаться вбок (потому что они добавляют и удаляют элементы в конце)

Итак, ngModelCtrl.$parsers.unshift insert ваша функция на first index и ngModelCtrl.$parsers.push будет insert ваша функция на last index

0 голосов
/ 26 мая 2018

Функции Unshift и Push не являются уникальными для AngularJS и представляют собой ванильную функцию Javascript.

Разница между unshift и push заключается в том, что unshift предварительно добавляет его к массиву (который в этом случае будет гарантировать, что функции будут запускаться первыми), где push добавляет его к массиву (разрешая все остальное в $Массив parsers для запуска перед проверкой. В этом конкретном случае рекомендуется использовать unshift, чтобы проверка выполнялась в первую очередь перед чем-либо еще.

Примечание: $ parsers - это обычный массив javascript, на самом деле он не является отличительнымв angularJS. Он наследует от array.prototype.

Давайте иметь массив ABCD

Например, для unshift («X») Массив будет выводить XABCD

Напримерfor push («X») Массив будет выводить ABCDX

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...