无法在 angularjs 中调用 Object.keys

新手上路,请多包涵

我正在使用 UI.Bootstrap 手风琴,我定义了我的标题,如下所示:

 <accordion-group ng=repeat="(cname, stations) in byClient">
    <accordion-heading>
        {{ cname }} <span class="pull-right"> {{ Object.keys(stations).length }} Stations</span>
    </accordion-heading>

当显示 Object.keys(stations).length 时,解析为空。如果我在我的控制器中放置相同长度的调用,我会得到预期的计数。有什么东西阻止方法调用在 AngularJS 中工作吗?

使用 stations 的手风琴的其余部分按预期运行,因此我知道它已正确填充。 byClient 数据结构基本上如下所示:

 {
    "Client Name" : {
        "Station Name": [
            {...},
            {...}
        ]
    }
 }

原文由 Gargoyle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 348
2 个回答

是的,那是因为 Objectwindow/global 的一部分,angular 无法根据范围评估该表达式。当您在绑定中指定 Object.keys 时,角度会尝试根据 $scope 对其进行评估,但找不到它。您可以将 object.keys 的引用存储在 rootScope 的某个实用程序中,并在应用程序的任何位置使用它。

是这样的:-

 angular.module('yourApp',[deps...]).run(function($rootScope){
  //Just add a reference to some utility methods in rootscope.
  $rootScope.Utils = {
     keys : Object.keys
  }

  //If you want utility method to be accessed in the isolated Scope
  //then you would add the method directly to the prototype of rootScope
  //constructor as shown below in a rough implementation.

  //$rootScope.constructor.prototype.getKeys = Object.keys;

});

并将其用作:-

 <span class="pull-right"> {{ Utils.keys(stations).length }} Stations</span>

那么这将可用于任何子范围,除了独立范围。如果您打算在隔离范围内执行此操作(例如:- 隔离范围指令),您需要在范围内添加 Object.keys 的引用,或者在范围内公开一个将返回的方法长度。

或者更好的是,创建一个格式过滤器来返回密钥长度并在任何地方使用它。

 app.filter('keylength', function(){
  return function(input){
    if(!angular.isObject(input)){
      throw Error("Usage of non-objects with keylength filter!!")
    }
    return Object.keys(input).length;
  }
});

并做:-

 {{ stations | keylength }}

演示

原文由 PSL 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用该函数确定对象属性的数量:

 $scope.keyLength = function (obj) {
    return Object.keys(obj).length;
}

并使用:

 {{ keyLength(myObj) }}

原文由 Alex V 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题