簡體   English   中英

變量更改未通知給$ scope。$ watch

[英]variable change not notified to `$scope.$watch`

我正在通過角度指令+控制器處理JQRangeSlider

在我的控制器中,我正在為范圍變量分配新值,但是即使更改已正確更新,也不會通知控制器范圍(我在指令中使用隔離的范圍'=' )。

// JQRangeSlider event handler
var valuesChanged = function(e, data) {
    if (data.values.min && data.values.max) {

        console.log('values changed', data.values); // this is always printed
        $scope.minselectedtime = data.values.min; // not triggering $scope.$watch
        $scope.maxselectedtime = data.values.max; 
        $scope.$broadcast('minchanged', $scope.minselectedtime); // instantly triggering $scope.$on('minchanged',...)
        console.log('scope', $scope);
    }
};


$scope.$watch('minselectedtime', function(newValue, oldValue) {
    if (newValue === oldValue) {
        return;
    }
    console.log('minselectedtime -->', newValue);
}, true);

$scope.$on('minchanged', function(event, min) {
    console.log('minchanged ==>', min);
});

$scope.$watch('minselectedtime', ...)僅在下一次$scope修改時觸發(其中$scope.minselectedtime甚至都沒有修改):

$scope.toggleTimeScale = function(refinementString) {
    console.log('scale set to', refinementString);
    $scope.timescale = refinementString; // year, month, day...
} 

為什么沒有立即將$scope.$watch通知變量更改?
隔離的代碼的$scope.minselectedtime值已更改,但是在觸發$scope.toggleTimeScale之前,父作用域不會更改其值。

您使用$ scope。$ apply()的方法是正確的。 原因是來自JQRangeSlider的更新發生在angularjs知識的“外部”。 如果閱讀有關$ apply方法的文檔( http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$apply ),您會發現它在需要的情況下使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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