【问题标题】:JavaScript array is NaN? AngularJS ngModelJavaScript 数组是 NaN? AngularJS ngModel
【发布时间】:2014-06-06 17:51:17
【问题描述】:

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

【问题讨论】:

  • 我最近遇到了同样的问题并放弃了。我没有使用requirelink 中的第四个参数,而是使用了scope: { ngModel: "=" },并且能够在link 函数中更改scope.ngModel
  • @mortsahl 抱歉,我完全不明白你的评论。
  • @Ian 感谢您描述您的经历。
  • @mortsahl 要求 ngModel 不是一个常见的用例吗?这种情况下错了吗?
  • 请参阅 docs.angularjs.org/api/ng/service/$compile 的要求文档

标签: javascript angularjs angular-ngmodel


【解决方案1】:

$viewValue$modelValue 默认为 Number.NaN -- JavaScript 定义 Not - a -编号。

检查 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 试图避免出现 nullundefined 这样的情况。视图值和模型值由“范围”绑定和定义。这就是 $scope 服务的重点——管理 modelValue 和 viewValue。

AngularJS 服务访问它们之前,它们默认为number.NaN

【讨论】:

  • 谢谢!你知道为什么modelvalue设置得这么晚吗?
  • @harry 它的框架性质是等到模型被引用。一个典型的应用程序可能在任何给定时间都有大量的视图模型。其中许多将在数据块中重叠。这就是您要登录到控制台的内容——对数据块的引用。当控制器范围内的服务引用时,模型由数据形成。当您认为模型取决于请求它的控制器的范围时,这是有道理的。一个事件必须触发消化循环
【解决方案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,与您的情况一样。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 2014-09-30
      • 2014-09-02
      • 2017-10-02
      • 1970-01-01
      相关资源
      最近更新 更多