无法在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
parsing为Object.keys(stations).length
。 如果我把同样长度的电话放在我的控制器里,我可以得到预期的计数。 有什么办法阻止在AngularJS中工作吗?
使用stations
的手风琴的其余部分按预期工作,所以我知道它正在适当填充。 byClient
数据结构基本如下所示:
{ "Client Name" : { "Station Name": [ {...}, {...} ] } }
是的,这是因为Object
是window/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) }}