无法在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).lengthparsing为Object.keys(stations).length 。 如果我把同样长度的电话放在我的控制器里,我可以得到预期的计数。 有什么办法阻止在AngularJS中工作吗?

使用stations的手风琴的其余部分按预期工作,所以我知道它正在适当填充。 byClient数据结构基本如下所示:

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

是的,这是因为Objectwindow/global的一部分,而angular不能根据范围来评估expression式。 当你在绑定的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的引用,或者在作用域上公开一个将返回长度的方法。

或者更好的是,创build一个格式filter来返回keylength并在任何地方使用。

 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 }} 

演示

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

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

并使用:

 {{ keyLength(myObj) }}