1

私は角度フィルタを使って角度定数の中にネストした定数の値を取得しようとしていました。しかし、私は値を取得する効率的な方法を見つけることができません。私はlodash "^ 2.4.1"を使うことが許されていて、_.pickを使ってみましたが、まだネストされたものではなく、ルートレベルの定数にしかアクセスできませんでした。angularjsの入れ子になった定数の値を取得するには?

//consider this 
angular.module('myApp',[]) 

.constants('appConstants', { 
    CONS1: 'root', 
    CONS2: { 
      NEST1: 'nested cons1', 
      NEST2: 'nested cons2', 
    } 
) 
.filter(getConstants, function () { 
    return function (input) { 
     var value = appConstants[input]; 
     if (! value) { 
      var keys = input.split('.'); 
      value = appConstants; 
      angular.forEach(keys, function(key, index) { 
       value = value[key]; 
      }); 
     } 
     return value; 
    } 
}); 

//where as 
appConstants[CONS1]; //works 
appConstants[CONS2.NEST1]; // return undefined 
//in lodash 
_.pick(appConstants, 'CONS2.NEST1'); // returns empty object 

答えて

2

多分これを試してみてください。私はあなたがコンテキスト定数としてあなたのルート定数オブジェクトを提供するなら、これがうまくいくと思います。私はlodash 2.4.1以前のバージョンを使用することを許可されていますので、私は_.get使用することはできません

$parse(input)(appConstants) 
+0

コードを変更する推奨編集を承認しないでください。 「コードを編集する必要があるのはいつですか?」(http://meta.stackoverflow.com/a/260246/1218980) –

+0

大丈夫ですが、それは私の答えとは関係ありません。 –

+1

ええ、あなたに通知する唯一の方法だから、提案された編集レビューにはコメントがありません。方法で良い答え! –

1

使用AngularJSは

AngularJS constant

はあると定義される値(ここではオブジェクト)である定数です。 NEST1を取得するには

{ 
    CONS1: 'root', 
    CONS2: { 
      NEST1: 'nested cons1', 
      NEST2: 'nested cons2', 
    } 
} 

は、通常のproperty accessors使用し、ドット表記appConstants.CONS1.NEST1やブラケット表記appConstants["CONS1"]["NEST1"]。 HTMLテンプレート

で最も簡単な方法は、定数へのアクセス


はちょうど$rootScopeに一定のオブジェクトを追加することです。

angular.module('myApp', []) 
    .constants('appConstants', { 
     CONS1: 'root', 
     CONS2: { 
      NEST1: 'nested cons1', 
      NEST2: 'nested cons2', 
     } 
    }) 
    .run(function($rootScope, appConstants) { 
     $rootScope.CONSTANTS = appConstants; 
    }); 

そして、どのテンプレートでも、オブジェクトとしてCONSTANTSを使用してください。

<span>{{ CONSTANTS.CONS2.NEST1 }}</span> 

出典:Lodash

を使用してCan I directly access module constant from HTML under AngularJS


あなたは本当にlodashを使用したい場合は、右のネストされたオブジェクトに解決するために、複雑なパスを可能にする_.get functionを使用しています。

_.get(appConstants, "CONS1.NEST1"); 

ので、フィルターはのような単純なものでした:

.filter("const", function() { 
    return function(input) { 
     return _.get(appConstants, input); 
    }; 
}); 

は値を取得するために、フィルタに文字列のパスを渡します。内蔵の代替私の意見では、このケースでLodashよりも優れたアプローチである、彼女の答えに

Amy Blankenship presents Angular's $parseをLodashする

{{ "CONS2.NEST1" | const }} 

。私はlodash 2.4.1の古いバージョンを使用することを許可されていますので、


私は_.getを使用することはできません。

_.getは非常に複雑で単純な実装を行いますstand-alone lodash package for _.get

  • を使用しますが、私たちの簡単な場合、ドットの単純な文字列split用:

  • は、2つのオプションがありますおそらくやるだろう。

    .filter("getConstants", function() { 
        return function(input) { 
         var obj = appConstants, 
          path = input.split('.'), 
          index = 0, 
          length = path.length; 
    
         while (obj != null && index < length) { 
          obj = obj[path[index++]]; 
         } 
         return obj; 
        }; 
    }); 
    

    +0

    :次のようになります

    。問題は、私のビュー(html)からStringとしてオブジェクトパスを渡すことができることです。 {{CONS2.NEST1 | getConstant}} < - これは動作しませんし、フィルタに達すると私に未定義を与えます。だから、私はそれをフィルターに渡しています - > {{'CONS2.NEST1' | getConstant}} –

    +1

    @BalajeeKs lodash 2.4.1に関連するセクションを追加しました。 –

    +0

    @BalajeeKs他の投稿内のコードを編集しないでください。コードはそのままで動作し、すでにルートレベルのプロパティを処理しています。 「コードを編集する必要はいつですか?」(http://meta.stackoverflow.com/a/260246/1218980) –

    0

    定数の宣言で閉じ括弧( '}')を忘れてしまった。あなたはまた、Angular $parse functionを使用するオプションを持っている

    .constants('appConstants', { 
        CONS1: 'root', 
        CONS2: { 
          NEST1: 'nested cons1', 
          NEST2: 'nested cons2', 
        } 
    }) 
    
    +0

    申し訳ありませんJermy、私は括弧が欠けていました:}この例では。私は自分のコードでそれを持っていた。 –

    関連する問題