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": [
{...},
{...}
]
}
}
_
はい、それはObject
がwindow/global
の一部であり、angularはスコープに対してその式を評価できないためです。バインディングでObject.keys
を指定する場合angularは$scope
に対して評価を試みますが、見つかりません。rootScopeのユーティリティでobject.keys
の参照を保存し、アプリ。
このようなもの:-
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 }}
デモ (
関数を使用して、オブジェクトプロパティの数を決定します。
$scope.keyLength = function (obj) {
return Object.keys(obj).length;
}
そして使用:
{{ keyLength(myObj) }}
filtersは、テンプレートコードの構造を処理する最もAngularJSの方法だと思います。
angular.module('app.filters').filter('objectKeysLength', [function() {
return function(items) {
return Object.keys(items).length;
};
}]);
angular.module('app.filters').filter('objectKeys', [function() {
return function(item) {
if (!item) return null;
var keys = Object.keys(item);
keys.sort();
return keys;
};
}]);
誰かがangular 2以上のソリューションを検索する場合。これは keyvalue パイプを嫌います。これはオブジェクトの相互作用に使用できます