Javascript $scope.$watch未捕获指令修改的值
我的指令将焦点放在span上,并将布尔值赋值,即每当我按下shifttab时,focusToSpan为true,但是,这种变化不会反映在我的控制器和模板中。我甚至用$scope.focusToSpan变量上的$watch进行了检查,如下所示 指令Javascript $scope.$watch未捕获指令修改的值,javascript,angularjs,angularjs-directive,angularjs-watch,angularjs-digest,Javascript,Angularjs,Angularjs Directive,Angularjs Watch,Angularjs Digest,我的指令将焦点放在span上,并将布尔值赋值,即每当我按下shifttab时,focusToSpan为true,但是,这种变化不会反映在我的控制器和模板中。我甚至用$scope.focusToSpan变量上的$watch进行了检查,如下所示 指令 (function() { 'use strict'; angular.module("my.page").directive('getFocusToSpan', function() { return {
(function() {
'use strict';
angular.module("my.page").directive('getFocusToSpan', function() {
return {
link: function(scope, elem, attr, ctrl) {
elem.bind("keydown keypress", function(event) {
if (event.which === 16) {
$('.iconclass').attr("tabIndex", -1).focus();
scope.focusToSpan = true;
}
});
}
};
});
})();
elem.bind("keydown keypress", function(event) {
if (event.which === 16) {
$('.iconclass').attr("tabIndex", -1).focus();
scope.focusToSpan = true;
scope.$apply();
}
});
控制器
$scope.$watch('focusToSpan', function(newValue) {
if (angular.isDefined(newValue)) {
alert(newValue);
}
});
我想知道指令中对控制器变量所做的更改将如何反映在控制器和模板中。
谢谢
Balaji。在角度上下文之外,您操作的范围/绑定不会得到更新。要更新绑定,您需要运行摘要循环来更新所有范围级别的绑定 在本例中,您正在从自定义事件更新angular
scope
变量,因此需要通过对scope执行$apply()
方法手动运行摘要循环
代码
(function() {
'use strict';
angular.module("my.page").directive('getFocusToSpan', function() {
return {
link: function(scope, elem, attr, ctrl) {
elem.bind("keydown keypress", function(event) {
if (event.which === 16) {
$('.iconclass').attr("tabIndex", -1).focus();
scope.focusToSpan = true;
}
});
}
};
});
})();
elem.bind("keydown keypress", function(event) {
if (event.which === 16) {
$('.iconclass').attr("tabIndex", -1).focus();
scope.focusToSpan = true;
scope.$apply();
}
});
谢谢你的回复,Pankaj会尽量让你know@balaji很高兴听到……干杯和感谢:)我建议改用
evalAsync()
,因为它只会在需要时触发一个新的摘要周期(即,如果尚未进行)@plamut基本上你需要在Manuel事件后运行摘要。同样,有很多方法可以做到这一点。$evalAsync、$timeout&$apply()是的,有很多种方法,但其中一些方法稍好一些。。)使用$evalAsync()
,如果一个摘要周期已在进行中,则更改稍后会在同一摘要周期中传播,而$apply()
会触发一个新周期(如果一个摘要周期已在进行中,则会引发错误)。