0
我有兩個指令。首先是使用(包括)秒。來自內部指令與主指令的通信 - 調用函數
這是我的孩子的指令:
angular.module('myApp')
.directive('radioType', function() {
return {
restrict: 'E',
scope: {
question: '=',
onAnswer: '&'
},
template: [
'<div>{{vm.question.text}}<br/>',
'<div>',
'<button ng-repeat="a in vm.question.answers track by $index" ng-click="onSelected(a)">{{a.text}}</button>',
'</div>',
'<button ng-click="myFunction()">Radio</button>',
'</div>'
].join(''),
controller: ['$scope', function($scope) {
$scope.myFunction = function() {
console.log("hello from radio controller");
$scope.vm.onAnswer();
};
$scope.onSelected = function(question) {
$scope.vm.question.answer = question.text;
console.log(question);
};
}],
controllerAs: 'vm',
bindToController: true
};
});
,這是我的主要指令:
angular.module('myApp')
.directive('question', function($compile) {
var combo = '<div>COMBO - {{vm.content.text}}</div>';
var radio = [
'<radio-type question="vm.content" onAnswer="vm.onAnswer()"></radio-type>'
].join('');
var input = [
'<input-type question="vm.content"></input-type>',
].join('');
var getTemplate = function(contentType) {
var template = '';
switch (contentType) {
case 'combo':
template = combo;
break;
case 'radio':
template = radio;
break;
case 'input':
template = input;
break;
}
return template;
}
var linker = function(scope, element, attrs) {
scope.$watch('vm.content', function() {
element.html(getTemplate(scope.vm.content.type))
$compile(element.contents())(scope);
});
}
return {
restrict: "E",
link: linker,
scope: {
content: '='
},
controller: ['$scope', function($scope) {
$scope.onAnswer = function() {
console.log("answer");
};
}],
controllerAs: 'vm',
bindToController: true
};
})
裏面的孩子指示我有按鈕,當有人點擊其中一個,我想從主指令調用函數。 我在我的子指令中包含了onAnswer: '&'
,並且我在主目錄模板中分配函數,但是我可以得到這個工作。
下面是Plunker顯示我的問題:http://plnkr.co/edit/iWU4L3IJLHtADHBl2dIh?p=preview
任何其他意見都歡迎。
謝謝這麼多的幫助。我是Angular的新手,我不知道我必須將函數聲明爲'$ scope.vm'。我是否可以正常地聲明它們,而不用'vm'?是因爲'bindToController'嗎? – Misiu
我剛剛更新了我的答案,沒有'vm'。完美的作品 – samura
再次感謝您。但是我想離開'controllerAs'(試圖遵循John Papa的styleguide)並且在範圍內聲明函數,而在中間沒有額外的'vm'。這甚至有可能嗎? – Misiu