Массив JavaScript - это NaN? AngularJS нгМодель

Я пытаюсь понять, каково значение ngModel:

.directive('myDir', function() {
  return {
    require: '?ngModel',
    link: function(scope, elm, attr, ngModel) {
      if (!ngModel)
        return

      console.log(ngModel)
      console.log(ngModel.$modelValue)
    }
  };
})

Несмотря на то, что моя ngModel представляет собой массив, он регистрирует NaN?

Что здесь происходит?


person Harry    schedule 06.06.2014    source источник
comment
У меня была точно такая же проблема недавно, и я сдался. Вместо использования require и 4-го параметра в link я просто использовал scope: { ngModel: "=" } и смог изменить scope.ngModel в функции link   -  person Ian    schedule 06.06.2014
comment
? - Попытаться найти требуемый контроллер или передать null на ссылку fn, если он не найден. -- Вы пытаетесь передать ngModel, а не контроллер.   -  person mortsahl    schedule 06.06.2014
comment
@mortsahl Извините, я совсем не понимаю вашего комментария.   -  person Harry    schedule 06.06.2014
comment
@Ian спасибо за описание вашего опыта.   -  person Harry    schedule 06.06.2014
comment
Используйте require, чтобы найти контроллер, а не модель   -  person mortsahl    schedule 06.06.2014
comment
@mortsahl, разве не требуется ngModel? В данном случае это неправильно?   -  person Harry    schedule 06.06.2014
comment
См. документацию по запросу на странице docs.angularjs.org/api/ng/service/$. компилировать   -  person mortsahl    schedule 06.06.2014


Ответы (3)


$viewValue и $modelValue по умолчанию имеют значение Number.NaN -- определение JavaScript для Not-a-Number.

проверьте Github и вы обнаружите, что

var NgModelController = ['$scope', '$exceptionHandler', '$attrs', 
                                 '$element', '$parse',
'$animate', '$timeout',
    function($scope, $exceptionHandler, $attr, $element, $parse, 
                   $animate, $timeout) 
  {
  this.$viewValue = Number.NaN;
  this.$modelValue = Number.NaN;

Почему это удобно? Потому что AngularJS старается избегать таких случаев, как null и undefined. Значения представления и значения модели связаны и определяются «областью действия». В этом смысл службы $scope — управлять значениями modelValue и viewValue.

Пока служба AngularJS не получит к ним доступ, по умолчанию они имеют значение number.NaN.

person Dave Alperovich    schedule 10.06.2014
comment
Спасибо! Вы знаете, почему значение модели устанавливается так поздно? - person Harry; 11.06.2014
comment
@harry в природе фреймворка ждать, пока не появится ссылка на модель. Типичное приложение, скорее всего, будет иметь множество моделей представления в любой момент времени. Многие из них будут перекрываться в блоке данных. Это то, что вы записываете в свою консоль — ссылка на блок данных. Модель формируется из данных, на которые ссылается служба в области действия контроллера. Это имеет смысл, если учесть, что модель зависит от области действия контроллера, запрашивающего ее. Событие должно запускать цикл дайджези - person Dave Alperovich; 11.06.2014

Предположительно, когда вы сначала регистрируете ngModel, ngModel.$modelValue на самом деле является NaN. Затем вы регистрируете ngModel.$modelValue и видите это. Затем запускаются различные наблюдатели и так далее, меняя ngModel.$modelValue на рассматриваемый массив. Затем вы открываете зарегистрированный в консоли объект (который вы зарегистрировали по ссылке и который, следовательно, будет отражать изменения) и увидите измененное значение.

Вы можете легко воспроизвести это в своей консоли:

var s = {
    some: 1,
    big: [ 1, 2, 3 ],
    object: [ "that gets a little drop-down arrow next to it when you log" ]
}
console.log(s);
s.some = "Changed!";

Щелкните раскрывающийся список рядом с исходным журналом и обратите внимание, что s.some показывает "Changed!" вместо 1, тогда как текст рядом с исходным журналом остается 1, как в вашем случае.

person Zach Snow    schedule 10.06.2014

Я не знаком со спецификой Angular.js, но на основании вашего снимка экрана и кода могу сделать обоснованное предположение.

В верхней строке скриншота зарегистрирован объект. «Предварительный просмотр» этого объекта (нераскрытая часть) показывает $modelValue: NaN. Тот же самый NaN регистрируется, когда вы делаете console.log(ngModel.$modelValue). Таким образом, в тот момент, когда вы регистрируете это, значение равно NaN.

Для предварительного просмотра объекта наведите указатель мыши на маленький синий значок «i», и он скажет вам: «Состояние объекта фиксируется при первом расширении». Это означает, что состояние объекта может измениться через какое-то время между его регистрацией и развертыванием.

Из этого я понял, что ваш ngModel инициализируется в каком-то «пустом» состоянии. Вы регистрируете его в этом пустом состоянии и видите NaN. Затем что-то еще меняет его, затем вы расширяете его, чтобы увидеть, что $modelValue — это массив.

person Dylan    schedule 10.06.2014