2017-05-27 10 views
2

私はこのコードを持っています。論理的には、これは無限レンダーループに入るはずです。しかし、それは安定しており、出力はabで、両方とも一緒に印刷されます。なぜこれが無限ループにならないのですか?

<div ng-if='hello'> 
    <span ng-init='hello=false'>a</span> 
</div> 
<div ng-if='!hello'> 
    <span ng-init='hello=true'>b</span> 
</div> 

これは私が取り組んでいるものの一部ではありません。それはちょうど私の頭の中にポップアップし、私はこれに答えを見つけることができませんでした。

編集

私は上記の例では@dfsqが指摘するようにということを理解し、ng-ifは新しいスコープを作成します。だから私はコードを少し変更しましたthis example。したがって、ここでは両方ともng-ifは同じオブジェクトを参照する必要があります。なぜここにループしていないのですか?

HTML

<div ng-app='app'> 
    <div ng-controller='appCtrl'> 
    <div ng-if='object.hello'> 
     <span ng-init='object.hello=false'>a</span> 
    </div> 
    <div ng-if='!object.hello'> 
     <span ng-init='object.hello=true'>b</span> 
    </div> 
    </div> 
</div> 

JS

(function() { 
    var app = angular.module("app", []); 

    app.controller("appCtrl", [ 
    "$scope", 
    function($scope) { 
     $scope.object = {}; 
     $scope.object.hello = true; 
    } 
    ]); 
})(); 
+1

を参照しているわけではありません同じインスタンスに –

答えて

3

論理的にこれは無限のレンダリングループに行く必要があります。

いいえ、そうしてはいけません。 ngIfディレクティブは新しい子スコープを作成します。そのため、ngInitはngIf(親スコープhello)で使用されるものに影響を与えない独立したフラグを変更(作成)します。 @dfsqがmencionedとして

+0

ありがとう。私はcodepenリンクで私の質問を更新しました。なぜそれはまだ安定していますか? – Anubhav

0

、あなたがのようなものを使用する必要があり、無限ループを作成したい場合は、新しいスコープを作成した場合、NG-:新しいスコープを作成し、その場合NG-彼らは

<div ng-if='hello'> 
    <span ng-init='$parent.hello=false'>a</span> 
</div> 
<div ng-if='!hello'> 
    <span ng-init='$parent.hello=true'>b</span> 
</div> 
関連する問題