JavaScript数组是NaN吗?AngularJS ngModel

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?这是怎么回事?

尝试定位所需的控制器或如果未找到则将null传递给链接fn。-- 您正在尝试传递ngModel而不是控制器。 - mortsahl
1
@mortsahl 抱歉,我完全不理解你的评论。 - Harry
1
@Ian 感谢您分享您的经验。 - Harry
1
@mortsahl 这不是一个常见的用例需要 ngModel 吗?在这种情况下使用它有什么问题吗? - Harry
1
请查看 https://docs.angularjs.org/api/ng/service/$compile 上的 require 文档。 - mortsahl
显示剩余2条评论
3个回答

6

$viewValue$modelValue 默认为Number.NaN -- JavaScript中的“不是数字”定义。

查看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。

谢谢!你知道为什么modelvalue设置得这么晚吗? - Harry
@harry 这是框架的特性,它会等待模型被引用。一个典型的应用程序可能会在任何时候拥有众多的视图模型。其中许多重叠于一块数据上。这就是你在控制台中记录的——对一块数据的引用。当服务在控制器范围内请求时,模型将从数据中形成。如果考虑到模型取决于请求它的控制器的作用域,这就是有意义的。事件必须触发digest周期。 - Dave Alperovich

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,就像你的情况一样。


0

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

在截图的顶部行,一个对象已被记录。该对象的“预览”(未展开部分)显示$modelValue: NaN。当您执行console.log(ngModel.$modelValue)时,同样的NaN被记录。因此,在记录它的那一刻,该值为NaN

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

从中我得出的结论是,您的ngModel在某种“空白”状态下初始化。您在该空白状态下记录它,并看到NaN。然后其他事情发生了改变,然后您展开它以查看$modelValue是一个数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接