2016-03-26 11 views
2

私はAngularJSコントローラのスコープ変数として非常に階層的なJSON構造を持っています。私はその変数のさまざまなセクションの周りをループしたい。私はng-initを使って構造体のどこにあるのかを考えました。ここではいくつかのコードは次のとおりです。AngularJS:ng-initの使用をはっきりと理解していません

my_app.js:

(function() { 
    var app = angular.module("my_app"); 
    app.controller("MyController", [ "$scope", function($scope) { 
    $scope.things = { 
     name: "a", 
     children: [ 
     { 
      name: "a.a", 
      children: [ 
      { name: "a.a.a" }, 
      { name: "a.a.b" } 
      ] 
     }, 
     { 
      name: "a.b", 
      children: [ 
      { name: "a.b.a" }, 
      { name: "a.b.b" } 
      ] 
     } 
     ] 
    } 
    }]); 
}); 

my_template.html:

<div ng-app="my_app" ng-controller="MyController"> 
    <ul> 
    <li ng-init="current_thing=things.children[0]" ng-repeat="thing in current_thing.children> 
     {{ thing.name }} 
    </li> 
    </ul> 
</div> 

私は、これはリストを表示するには期待:

a.a.b

  • a.a.aしかし、それは何も表示されません。

    もちろん、ループを明示的に指定すると(ng-repeat="thing in things.children[0].children")、うまく動作します。しかし、テンプレートコードのほんの少しのスニペットは、私のアプリケーションのさまざまなレベルでさまざまなレベルの「もの」で実行する必要があります。

    (ただ、人生が複雑にするために、私はDjangoの賢さを経由して他の標準のJavaScriptまたはを使用して、現在のもののレベルを取得することができます。)

    任意のアイデア?

    答えて

    4

    ng-initは、ng-repeat(1000)より低いプライオリティ(450)で実行されます。その結果、同じ要素に配置された場合、ng-repeatが最初にコンパイルされ、によって作成されたスコーププロパティは、ng-repeatが実行されるまで定義されません。

    このように、この方法で使用する場合は、代わりに親要素に配置する必要があります。

    <div ng-app="my_app" ng-controller="MyController"> 
        <ul ng-init="current_thing=things.children[0]"> 
        <li ng-repeat="thing in current_thing.children> 
         {{ thing.name }} 
        </li> 
        </ul> 
    </div> 
    
    +0

    ありがとう。これでこのおもちゃの例が修正されました。しかし、実際のコードではまだ動作していません。私はもう少し考えをして、あなたに戻ってくる必要があります。 – trubliphone

    +0

    私の喜び。原則は同じでなければなりません。しかし、ng-initはコストがかかり、主にデバッグしています。バッキングコントローラの適切なデータ構造に対してng-initをデバッグするのはずっと難しくなります。 –

    関連する問題