指令链接中的范围变量不会更新到指令控制器使用 Angular 读取它时
Scope variable in Directive Link is not updated to when Directive Controller reads it using Angular
这是我的代码
var directive = {
restrict: 'E',
templateUrl: '/static/myTemplate.html',
scope: {
},
controller: ["$scope", controllerFunc],
controllerAs: 'multiCheckboxCtrl',
bindToController: true,
link: linkFunc,
};
return directive;
function controllerFunc($scope) {
// $watch List
/**
* Event handler for searchText change
*/
$scope.$watch(angular.bind(this, function () {
return $scope.multiCheckboxCtrl.clickedElsewhere.value;
}), function (newVal) {
if (newVal !== undefined && newVal !== "") {
console.log(newVal);
console.log("I am here");
}
});
}
function linkFunc(scope, element, attr){
// Detect Element Click Logic
scope.multiCheckboxCtrl.clickedElsewhere = {value: false};
$document.on('click', function(){
scope.multiCheckboxCtrl.clickedElsewhere.value = false;
console.log(scope.multiCheckboxCtrl.clickedElsewhere);
});
element.on('click', function(){
event.stopPropagation();
scope.multiCheckboxCtrl.clickedElsewhere.value = true;
console.log(scope.multiCheckboxCtrl.clickedElsewhere);
});
// End Detect Element Click Logic
}
linkFunc 基本上确定是否单击指令元素。
我验证了每当单击指令元素时,它都会控制台 true,而当单击指令元素之外的任何元素时,它都会控制台 false。
但是,似乎我在控制器中的$watch
没有捕捉到变化。
谁能告诉我出了什么问题
谢谢
Angular 不知道事件侦听器中存在更改对象属性。
正如文档所说:
$apply()
用于从角度框架外部执行角度表达式。(例如,从浏览器DOM events
、setTimeout
、XHR
或第三方库)。因为我们正在调用角度框架,所以我们需要执行异常处理的适当范围生命周期,执行监视。
jsfiddle上的活生生的例子。
angular.module('ExampleApp', [])
.controller('ExampleController', function($scope) {
})
.directive('clickDirective', function() {
var directive = {
restrict: 'E',
template: '<div>click me</div>',
scope: {},
controller: ["$scope", controllerFunc],
controllerAs: 'multiCheckboxCtrl',
bindToController: true,
link: linkFunc,
};
return directive;
function controllerFunc($scope) {
// $watch List
/**
* Event handler for searchText change
*/
$scope.$watch(function() {
return $scope.multiCheckboxCtrl.clickedElsewhere.value;
}, function(newVal) {
if (newVal !== undefined && newVal !== "") {
console.log(newVal);
console.log("I am here");
}
});
}
function linkFunc(scope, element, attr) {
// Detect Element Click Logic
scope.multiCheckboxCtrl.clickedElsewhere = {
value: false
};
angular.element(document).on('click', function() {
scope.multiCheckboxCtrl.clickedElsewhere.value = false;
console.log(scope.multiCheckboxCtrl.clickedElsewhere);
scope.$apply();
});
element.on('click', function() {
event.stopPropagation();
scope.multiCheckboxCtrl.clickedElsewhere.value = true;
console.log(scope.multiCheckboxCtrl.clickedElsewhere);
scope.$apply();
});
// End Detect Element Click Logic
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<div ng-app="ExampleApp">
<div ng-controller="ExampleController" id="ExampleController">
<click-directive></click-directive>
<div>
click elsewhere
</div>
</div>
</div>
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 使用指令的angular js中的Like和different
- Angular,从指令控制器中的控制器触发函数
- 角度指令控制器:参数不是函数,未定义
- 滚动指令在Angular JS中不起作用
- 在控制器angular js之间共享数据
- 如何将值传递到角度中的指令控制器
- 在一个控制器中更新服务变量,并在另一个控制器 - Angular JS中使用更新的值
- 无权访问我的控制器 Angular 中的属性.js 1.3
- angularjs+ui.router:指令控制器和链接函数之间的不同行为
- 自动更新控制器Angular Metroet中的记录
- 显示控制器angular js的模态
- 指令链接中的范围变量不会更新到指令控制器使用 Angular 读取它时
- Angular js 指令控制器访问范围属性,但返回未定义
- 像ng-click、ng-onmoseover这样的指令在angular控制器生成的子元素中不起作用
- 在angular中创建自定义鼠标悬停,并将$event传递给指令控制器
- 在Angular.js中从指令控制器调用工厂
- Angular:从单独的控制器调用指令控制器函数
- Angular指令控制器——等待属性的赋值/求值
- 如何用Angular的方式将更新后的对象从Service发送到指令控制器函数