1

この問題は奇妙だと思います。

基本的に、条件に基づいてページにブロックが存在するようにしng-ifます。しかし、ng-if上記のブロック内でそれを変更しようとしても、他の要素には影響しません。

なぜこうなった?

JSFiddle はここにあり、コードは以下のとおりです。

<div ng-controller="MyCtrl">
    <div ng-init="shouldShow=false">
        <div ng-if="!shouldShow">
            <p>{{shouldShow}}</p>
            <div>
                <button ng-click="shouldShow=!shouldShow">Hide Section</button>
                <button ng-if="!shouldShow">Should Disappear</button>
            </div>
        </div>
    </div>
</div>
4

2 に答える 2

1

ng-ifのドキュメントでは、何が起こるかを説明しています:

要素が ngIf を使用して削除されると、そのスコープは破棄され、要素が復元されると新しいスコープが作成されることに注意してください。ngIf 内で作成されたスコープは、プロトタイプ継承を使用して親スコープから継承します。これの重要な意味は、ngModel が ngIf 内で使用され、親スコープで定義された JavaScript プリミティブにバインドされている場合です。この場合、子スコープ内の変数に加えられた変更は、親スコープの値をオーバーライド (非表示) します。

要するに、子スコープで変更すると、親スコープをshouldShowオーバーライドします(プロトタイプの継承)。shouldShow別の回答で指摘されているように、これは共有オブジェクトを介した間接化で解決できます: wrapperObject.shouldShow. 子スコープで新しい値を割り当てない限りwrapperObject、親スコープと同じインスタンスを指します (したがって、同じインスタンスを含みますshouldShow)。

于 2015-03-01T12:44:59.293 に答える