2

問題

ng-repeat ディレクティブが新しい​​配列の追加を追跡できないことがわかりました。
私の例では、新しい配列は「options」です。
ディレクティブは、ng-dialog (サードパーティ ライブラリ) を使用して表示されるテンプレートの一部です。
ダイアログボックスを閉じて再度開くと、閉じる前に行った変更が ng-repeat に反映されます。

$scope.$apply(); を試しました しかし、すでに実行されているという警告が表示されます。

アップデート ++

私が最終的に使用した解決策は、最初にその配列の存在を確認する関数を ng-init に追加することでした。存在しない場合は、それを作成してから新しい変数に割り当てました。

より詳細な例を次に示します。
この jsFiddle を作成すると、問題が ng-include/ng-repeat 内にあることが指摘されました。これがなくても問題ありません。 http://jsfiddle.net/20mobk2h/56/
http://jsfiddle.net/20mobk2h/61/

ng-repeat は、存在する場合と存在しない場合があるオプションと呼ばれる配列でループします。

<div ng-init="options = element.options">
    <div ng-repeat="option in options" ng-include="'optionsTree'"></div>
</div>

次の方法で新しいオプションを追加します。

$scope.addItem = function(item) {

    if(!item.options){
        item.options = [];
    }

    var obj = {
        val: 'blah'
    };

    item.options.push(obj);
}
4

3 に答える 3

1

$scope.$apply()本当にあなたの問題の解決策になるはずです。

このラッパーを使用してみてください$scope.$apply()

$scope.safeApply = function(fn) {
  var phase = this.$root.$$phase;
  if(phase == '$apply' || phase == '$digest') {
    if(fn && (typeof(fn) === 'function')) {
      fn();
    }
  } else {
    this.$apply(fn);
  }
};

そして、必要な場所で $apply を safeApply に置き換えるだけです

$scope.safeApply(function() {
  alert('Now I'm wrapped for protection!');
});

おそらく、実行する必要がある関数を渡します。applyこれを使用すると、適用 - ダイジェスト サイクルを尊重し、許可されている場合にのみ実行できるはずです。

ここから撮影

于 2014-10-07T10:23:39.630 に答える
1

このコードを変更します。

<div ng-init="options = item.options">
    <div ng-repeat="option in options" ng-include="'nest_options'"></div>
</div>

これに:

<div>
    <div ng-repeat="option in item.options" ng-include="'nest_options'"></div>
</div>

ここでの問題は、item.options新しい変数に割り当てるときに、オブジェクトとのoptions参照が壊れることですitem。これは、初めて ( item.optionsisの場合undefined) オプションがundefinedあり、プリミティブ値が Javascript で値によって渡されるためです。そのため、後でoptions(新しい配列要素を追加して) プロパティを変更すると、この変更はoptions変数に反映されません。

ただし、ポップアップを 2 回目に開くと、item.optionsは ではなくundefined、既にオブジェクト (配列) であるため、代入options = item.optionsは通常のオブジェクト参照になり、 への変更item.optionsは にミラーリングされitemます。

デモ: http://jsfiddle.net/20mobk2h/57/

于 2014-10-07T12:46:52.000 に答える
0

コントローラーとページの完全なコードを記述できますか? 年ページと routeProvider の両方で ng-controller を指定しましたか? routeProvider で指定されている場合は、ページから ng-controller を削除します。

于 2014-10-07T11:10:59.940 に答える