[英]$scope.$watch in Angular doesn't work in Ionic/Cordova
[英]Angular scope watch doesn't work in my app
我有以下代碼,試圖根據全局窗口范圍中是否按下了鍵來顯示/隱藏文本框。 但是,每次按下一個鍵,似乎都無法啟動監視服務。 為什么是這樣?
請點擊此處http://plnkr.co/edit/qL9ShNKegqJfnyMvichk
app.controller('MainCtrl', function($scope, $window) {
$scope.name = '';
angular.element($window).on('keypress', function(e) {
//this changes the name variable
$scope.name = String.fromCharCode(e.which);
console.log($scope.name)
})
$scope.$watch('name', function() {
console.log('hey, name has changed!');
});
});
這是因為您要在摘要周期之外處理keypress
事件。 我強烈建議您通過數據綁定或使用ngKeypress
來讓angular發揮ngKeypress
否則,在您的處理程序中,調用$scope.$digest()
。
angular.element($window).on('keypress', function(e) {
//this changes the name variable
$scope.name = String.fromCharCode(e.which);
console.log($scope.name);
$scope.$digest();
})
從較高的角度來看,觀察范圍的值需要兩個部分:
第一:觀察者-就像您創建的一樣。 每個觀察者都有兩個部分,監視功能(或此處的值)和偵聽器功能。 watch函數返回被監視的對象,當對象發生更改時,將調用偵聽器函數。
第二:$ digest循環。 $ digest在作用域上的所有監視程序上循環,調用監視功能,將返回的newValue與oldValue進行比較,如果這兩個不匹配,則調用相應的偵聽器功能。 這稱為臟檢查。
但是,有人必須踢出最有價值的東西。 Angular在它的指令中為您執行此操作,因此您無需在意。 同樣,所有內置服務都將開始摘要。 但是,如果您在angular的控制范圍之外更改對象,則必須自己調用$ digest,或者使用首選方法,請使用$ apply。
$scope.$apply(function(newName) {
$scope.name = newName;
});
$ apply首先評估函數,然后啟動$ digest。
在您的特殊情況下,我建議使用ngKeypress進行成角度的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.