我正在使用角度模块然后发送消息,我试图将变量设置为true或false但我注意到它们不会在UI中更新,除非我将它们包装在$ apply中。这是最好的方法。
这是我的工作代码,删除$ apply,尽管变量已更新 - 视图永远不会更新。
$scope.$on('duScrollspy:becameActive', ($event, $element, $target) => {
$scope.$apply(() => {
this.ready = true;
});
});
任何想法最好的方法来解决这个问题?调用$ apply看起来像代码味道,我知道听取范围上的事件并不被认为是好的做法,但这是第3部分角度模块。
由于
答案 0 :(得分:1)
修改事件内的范围需要调用$ apply()。
(this
绑定到范围btw)
没有办法绕过它。 (如果您需要更新视图。)
$apply
实际上是在许多地方自动调用的,例如$ http promise resolve code(https://github.com/angular/angular.js/blob/master/src/ng/http.js第1331-1351行),但事件没有被调用。
注意,行号可能会改变。搜索function done()
所以这不是代码味道,这是标准的。
答案 1 :(得分:0)
您的问题可能是this
关键字。重要的是要记住this
根据使用它的上下文改变它的含义。您可能认为this
指的是您的控制器,服务或您在其中定义了您的监听器的任何对象。这就是为什么你会看到这种将控制器命名为第一种语句的常见模式:
function MyController($scope, $rootScope) {
var vm = this;
$scope.$on('duScrollspy:becameActive', ($event, $element, $target) => {
vm.ready = true;
// or
$scope.ready = true
// is better than
this.ready = true;
});
}