[解決済み] angularで複数の変数の変化を$watchする方法 [重複].
2023-05-10 14:46:36
質問
方法
$scope.$watch
Angularで複数の変数を使用し、そのうちの1つが変更されたときにコールバックをトリガーする方法。
$scope.name = ...
$scope.age = ...
$scope.$watch('???',function(){
//called when name or age changed
})
どのように解決するのですか?
アップデイト
Angularは現在、2つのスコープメソッドを提供しています。 $watchGroup (1.3 以降) と ウォッチコレクション . これらは @blazemonger と @kargold によって言及されています。
これは型や値とは無関係に動作するはずです。
$scope.$watch('[age,name]', function () { ... }, true);
この場合、第3パラメータをtrueに設定する必要があります。
文字列の連結である
'age + name'
はこのような場合、失敗します。
<button ng-init="age=42;name='foo'" ng-click="age=4;name='2foo'">click</button>
ユーザーがボタンをクリックする前に、ウォッチされている値は次のようになります。
42foo
(
42
+
foo
) とクリックした後に
42foo
(
4
+
2foo
). というわけで、ウォッチ関数は呼ばれない。そのため、このようなケースが発生しないことを保証できない場合は、配列式を使用した方がよいでしょう。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="//cdn.jsdelivr.net/jasmine/1.3.1/jasmine.css" rel="stylesheet" />
<script src="//cdn.jsdelivr.net/jasmine/1.3.1/jasmine.js"></script>
<script src="//cdn.jsdelivr.net/jasmine/1.3.1/jasmine-html.js"></script>
<script src="http://code.angularjs.org/1.2.0-rc.2/angular.js"></script>
<script src="http://code.angularjs.org/1.2.0-rc.2/angular-mocks.js"></script>
<script>
angular.module('demo', []).controller('MainCtrl', function ($scope) {
$scope.firstWatchFunctionCounter = 0;
$scope.secondWatchFunctionCounter = 0;
$scope.$watch('[age, name]', function () { $scope.firstWatchFunctionCounter++; }, true);
$scope.$watch('age + name', function () { $scope.secondWatchFunctionCounter++; });
});
describe('Demo module', function () {
beforeEach(module('demo'));
describe('MainCtrl', function () {
it('watch function should increment a counter', inject(function ($controller, $rootScope) {
var scope = $rootScope.$new();
scope.age = 42;
scope.name = 'foo';
var ctrl = $controller('MainCtrl', { '$scope': scope });
scope.$digest();
expect(scope.firstWatchFunctionCounter).toBe(1);
expect(scope.secondWatchFunctionCounter).toBe(1);
scope.age = 4;
scope.name = '2foo';
scope.$digest();
expect(scope.firstWatchFunctionCounter).toBe(2);
expect(scope.secondWatchFunctionCounter).toBe(2); // This will fail!
}));
});
});
(function () {
var jasmineEnv = jasmine.getEnv();
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
jasmineEnv.specFilter = function (spec) {
return htmlReporter.specFilter(spec);
};
var currentWindowOnload = window.onload;
window.onload = function() {
if (currentWindowOnload) {
currentWindowOnload();
}
execJasmine();
};
function execJasmine() {
jasmineEnv.execute();
}
})();
</script>
</head>
<body></body>
</html>
http://plnkr.co/edit/2DwCOftQTltWFbEDiDlA?p=preview
PS:
コメントで@reblaceさんが述べているように、もちろん値にアクセスすることは可能です。
$scope.$watch('[age,name]', function (newValue, oldValue) {
var newAge = newValue[0];
var newName = newValue[1];
var oldAge = oldValue[0];
var oldName = oldValue[1];
}, true);
関連
-
[解決済み】npm UNMET PEER DEPENDENCYの警告を修正するにはどうすればいいですか?
-
[解決済み] AngularJSのグローバル変数
-
[解決済み] AngularJSの「href」と「ng-href」の違いについて
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] angular-routeとangular-ui-routerの違いは何ですか?
-
[解決済み] 複数の$scope属性を監視する
-
[解決済み] AngularJS : なぜangularでは{{}}よりもng-bindが良いのですか?
-
[解決済み】$watch an object
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】typeerrorは、未定義のプロパティ'data'を読み取ることができません。
-
[解決済み] Angular JS $locationChangeStart 次の url ルートオブジェクトを取得する
-
[解決済み] ng-pattern` - 数字だけをチェックする方法は?
-
[解決済み] createspyとcreatespyobjの違いは何ですか?
-
angularjs統合ueditor入門
-
角型グローバル確認ボックス
-
[解決済み] AngularJS: ngRouteが動作しない。
-
[解決済み] どのように$state.goにパラメータを追加しますか?
-
[解決済み] Angular JSによるシンプルなポップアップ
-
[解決済み] 複数の$scope属性を監視する