从指令更改控制器 $scope
change controller $scope from a directive
我有一个控制器:
function myController($scope) {
$scope.clicked = false;
}
和指令:
function myDirective() {
return {
restrict: 'E',
link: function(scope, elem, attrs) {
elem.bind('click', function() {
// need to update controller $scope.clicked value
});
},
template: '<div>click me</div>';
replace: true;
}
}
我是这样使用它的:
<div ng-controller="myController">
<my-directive></my-directive>
</div>
如何更改 $scope.clicked 的控制器值?
谢谢!
由于您不在指令中使用独立作用域,因此可以使用 scope.$parent.clicked
访问父作用域 属性。
link: function(scope, elem, attrs) {
elem.bind('click', function() {
scope.$parent.clicked = ...
});
},
我不建议使用 scope.$parent
来更新或访问父范围值,您可以 two way bind
需要更新的控制器变量到您的指令中,因此您的指令变为:
function myDirective() {
return {
restrict: 'E',
scope: {
clicked: '='
},
link: function(scope, elem, attrs) {
elem.bind('click', function() {
// need to update controller $scope.clicked value
$scope.clicked = !$scope.clicked;
});
},
template: '<div>click me</div>';
replace: true;
}
}
现在从父clicked
传递这个
<div ng-controller="myController as parentVm">
<my-directive clicked="parentVm.clicked"></my-directive>
</div>
function myController() {
var parentVm = this;
parentVm.clicked = false;
}
我建议您继续阅读有关为您的控制器使用 controllerAs
语法的内容,因为这将真正巩固此处使用双向绑定的概念。
我喜欢将 $scope.$emit 用于此类目的。它允许将数据从指令发送到控制器。
您应该在控制器中创建自定义侦听器:
$scope.$on('cliked-from-directive', function(event, data){
console.log(data)
})
如您所见,现在您可以完全访问您的控制器范围并且可以做任何您想做的事情。在你的指令中只是使用 scope.$emit
link: 函数(作用域、元素、属性){
elem.bind('click', function() {
scope.$emit('cliked-from-directive', {a:10})
});
这里我为你创建了jsfiddle
我有一个控制器:
function myController($scope) {
$scope.clicked = false;
}
和指令:
function myDirective() {
return {
restrict: 'E',
link: function(scope, elem, attrs) {
elem.bind('click', function() {
// need to update controller $scope.clicked value
});
},
template: '<div>click me</div>';
replace: true;
}
}
我是这样使用它的:
<div ng-controller="myController">
<my-directive></my-directive>
</div>
如何更改 $scope.clicked 的控制器值? 谢谢!
由于您不在指令中使用独立作用域,因此可以使用 scope.$parent.clicked
访问父作用域 属性。
link: function(scope, elem, attrs) {
elem.bind('click', function() {
scope.$parent.clicked = ...
});
},
我不建议使用 scope.$parent
来更新或访问父范围值,您可以 two way bind
需要更新的控制器变量到您的指令中,因此您的指令变为:
function myDirective() {
return {
restrict: 'E',
scope: {
clicked: '='
},
link: function(scope, elem, attrs) {
elem.bind('click', function() {
// need to update controller $scope.clicked value
$scope.clicked = !$scope.clicked;
});
},
template: '<div>click me</div>';
replace: true;
}
}
现在从父clicked
传递这个
<div ng-controller="myController as parentVm">
<my-directive clicked="parentVm.clicked"></my-directive>
</div>
function myController() {
var parentVm = this;
parentVm.clicked = false;
}
我建议您继续阅读有关为您的控制器使用 controllerAs
语法的内容,因为这将真正巩固此处使用双向绑定的概念。
我喜欢将 $scope.$emit 用于此类目的。它允许将数据从指令发送到控制器。 您应该在控制器中创建自定义侦听器:
$scope.$on('cliked-from-directive', function(event, data){
console.log(data)
})
如您所见,现在您可以完全访问您的控制器范围并且可以做任何您想做的事情。在你的指令中只是使用 scope.$emit
link: 函数(作用域、元素、属性){
elem.bind('click', function() {
scope.$emit('cliked-from-directive', {a:10})
});
这里我为你创建了jsfiddle