[英]Angular 1.5: Access bindToController properties inside controller
我正在学习如何正确使用自定义指令的 bindToController 功能,并想知道如何从指令控制器访问您在 bindToController 对象中声明的属性。
var myApp = angular.module('myApp',[])
.directive('myDir', MyDir)
.controller('MyCtrl',['$scope', MyCtrlFn]);
function MyCtrlFn($scope) {
var ctrl = this;
this.ctrlStr = '';
this.ctrlAsStr = '';
$scope.$watch(this.name, function(newValue) {
if(newValue) ctrl.ctrlStr += ' '+newValue;
})
$scope.$watch('ctrl.name', function(newValue) {
if(newValue) ctrl.ctrlAsStr += ' '+newValue;
})
}
function MyDir() {
return {
template: '<div>{{ctrl.name}}</div>'+
'<div>CtrlStr: {{ctrl.ctrlStr}}</div>'+
'<div>CtrlAsStr: {{ctrl.ctrlAsStr}}</div>',
scope: {},
bindToController: {
name: '='
},
restrict: 'E',
controller: 'MyCtrl',
controllerAs: 'ctrl'
}
}
jsFiddle在这里: http : //jsfiddle.net/jrtc1bLo/2/
所以我认为属性绑定到控制器,但似乎它们绑定到范围内的控制器别名。
从控制器访问它们的好方法是什么?
谢谢
如果您更正第一个观察者,您将看到您的控制器已正确绑定。
function MyCtrlFn($scope) {
var ctrl = this;
this.ctrlStr = '';
this.ctrlAsStr = '';
//DO THIS
$scope.$watch(function(){return ctrl.name}, function(newValue) {
// NOT THIS
//$scope.$watch(this.name, function(newValue) {
if(newValue) ctrl.ctrlStr += ' '+newValue;
})
$scope.$watch('ctrl.name', function(newValue) {
if(newValue) ctrl.ctrlAsStr += ' '+newValue;
})
}
$watch
的第一个参数要么是一个在每个摘要周期评估的函数,要么是一个字符串形式的 Angular 表达式,它在每个摘要周期评估。
通过更正,两个观察者都会看到变化。
看看这个例子:
angular
.module('form')
.controller('FormGroupItemController', FormGroupItemController)
.directive('formGroupItem', formGroupItem);
function FormGroupItemController(){}
function formGroupItem() {
var directive = {
restrict: 'A',
scope: {
model: '=',
errors: '=',
submit: '='
},
bindToController: true,
controller: 'FormGroupItemController as vm',
templateUrl: 'app/form/form-group-item.html'
};
return directive;
}
如您所见,我有一个form-group-item
指令。 我在我的 HTML 中使用它,如下所示:
<div form-group-item model="vm.username" errors="vm.errors" submit="vm.updateUsername"></div>
在这里,我从指令使用的范围中提取了三样东西,我基本上复制了指令本身的它们(将它们绑定到控制器)。 这三件事是:模型、错误和提交。
错误是一包可能的错误(数组),模型只是一个要观察的值,提交是一个提交函数。
现在这三件事都在FormGroupItemController
的范围内,我可以在form-group-item.html
用作$scope
或controllerAs
,无论我指定哪个。 在这种情况下,我使用 controllerAs 语法。
所以在指令绑定到它的控制器之前,它只是一个像这样的空构造函数:
function FormGroupItemController() {}
绑定后,它将如下所示:
function FormGroupItemController() {
this.model = 'blah';
this.errors = [...];
this.submit = function(...) {...}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.