[解決済み] Angularディレクティブのデータ変更に対する$watch'ing
質問
どのようにすれば
$watch
変数をトリガーし、その変数に新しいオブジェクトを割り当てないようにするにはどうしたらよいでしょうか?
私は現在、JSONファイルから読み込まれている単純なデータセットを持っています。 私のAngularコントローラはこれを行うだけでなく、いくつかの関数を定義しています。
App.controller('AppCtrl', function AppCtrl($scope, JsonService) {
// load the initial data model
if (!$scope.data) {
JsonService.getData(function(data) {
$scope.data = data;
$scope.records = data.children.length;
});
} else {
console.log("I have data already... " + $scope.data);
}
// adds a resource to the 'data' object
$scope.add = function() {
$scope.data.children.push({ "name": "!Insert This!" });
};
// removes the resource from the 'data' object
$scope.remove = function(resource) {
console.log("I'm going to remove this!");
console.log(resource);
};
$scope.highlight = function() {
};
});
私の場合は
<button>
を適切に呼び出した
$scope.add
関数が適切に呼び出され、新しいオブジェクトが適切に
$scope.data
に正しく挿入されます。 私がセットアップしたテーブルは、"add" ボタンを押すたびに更新されます。
<table class="table table-striped table-condensed">
<tbody>
<tr ng-repeat="child in data.children | filter:search | orderBy:'name'">
<td><input type="checkbox"></td>
<td>{{child.name}}</td>
<td><button class="btn btn-small" ng-click="remove(child)" ng-mouseover="highlight()"><i class="icon-remove-sign"></i> remove</button></td>
</tr>
</tbody>
</table>
しかし、私が設定したディレクティブは、監視するために
$scope.data
を監視するように設定したディレクティブは、 このようなことが起こったときに起動されません。
HTMLでタグを定義しています。
<d3-visualization val="data"></d3-visualization>
これは、以下のディレクティブと関連しています (質問の正しさのために切り詰めています)。
App.directive('d3Visualization', function() {
return {
restrict: 'E',
scope: {
val: '='
},
link: function(scope, element, attrs) {
scope.$watch('val', function(newValue, oldValue) {
if (newValue)
console.log("I see a data change!");
});
}
}
});
を取得します。
"I see a data change!"
のメッセージが表示されますが、quot;add"ボタンを押しても表示されません。
どうすれば
$watch
にオブジェクトを追加したり削除したりするだけなのに、どのようにして
data
オブジェクトに割り当てる新しいデータセットを取得するのではありません。
data
オブジェクトに割り当てるための、まったく新しいデータセットを取得しないのですか?
どのように解決するのですか?
深いオブジェクトのダーティチェックを有効にする必要があります。 デフォルトでは、angularはウォッチしているトップレベルの変数の参照のみをチェックします。
App.directive('d3Visualization', function() {
return {
restrict: 'E',
scope: {
val: '='
},
link: function(scope, element, attrs) {
scope.$watch('val', function(newValue, oldValue) {
if (newValue)
console.log("I see a data change!");
}, true);
}
}
});
見る スコープ . watch関数の第3パラメータをtrueに設定すると、ディープダーティチェックが可能になります。
ディープダーティチェックは
高価
. そのため、もし子配列を見るだけなら
data
を見るだけなら、直接その変数を見ればいいのです。
scope.$watch('val.children', function(newValue, oldValue) {}, true);
バージョン1.2.x導入 ウォッチコレクション
Shallow はオブジェクトのプロパティを監視し、プロパティが変更されるたびに処理を開始します (配列の場合、これは配列の項目を監視することを意味します; オブジェクトマップの場合、これはプロパティを監視することを意味します)。
scope.$watchCollection('val.children', function(newValue, oldValue) {});
関連
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
[解決済み】ExpressJS - throw er Unhandled errorイベント
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] angular-routeとangular-ui-routerの違いは何ですか?
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
vueにおけるfilterの適用シーンについて解説します。
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
[解決済み】ReactJSでエラー発生 Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。