4

我想看看 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?

这里发生了什么?

4

3 回答 3

6

$viewValue and $modelValue default to Number.NaN -- JavaScript Definition for Not - a - Number.

check Github and you find that

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;

Why is this convienient? Because AngularJS tries to avoid having cases like null and undefined. View Values and Model Values are bound and defined by "scope". That's the point of the $scope service -- to manage the modelValue and viewValue.

Until an AngularJS service accesses them, they are defaulted to number.NaN

于 2014-06-10T23:10:09.790 回答
2

大概当您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,就像您的情况一样。

于 2014-06-10T19:55:24.433 回答
0

我不熟悉 Angular.js 的细节,但根据您的屏幕截图和代码,我可以提供一个有根据的猜测。

在屏幕截图的第一行,已记录了一个对象。该对象的“预览”(未展开的部分)显示$modelValue: NaN. NaN执行时也会记录相同的内容console.log(ngModel.$modelValue)。因此,在您记录它的那一刻,该值为NaN.

对于您的对象预览,将鼠标悬停在蓝色的小“i”图标上,它会告诉您“对象状态在第一次扩展时被捕获”。这意味着对象的状态可能会在您记录它和展开它之间的一段时间内发生变化。

我从中收集到的是,您ngModel的初始化处于某种“空白”状态。您以空白状态记录它,然后查看NaN. 然后其他东西改变了它,然后你展开它以查看它$modelValue是一个数组。

于 2014-06-10T19:56:40.657 回答