簡體   English   中英

角度范圍手表在我的應用中不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM