我发现这个问题让我几乎到了我需要的地方。 Why doesn't ng-click work in my directive and how do I add a toggle class?
这使得我的指令模板中的ng-click触发了我的控制器中的一个功能。 http://plnkr.co/edit/GorcZZppa8qcIKbQAg2v?p=preview
问题是返回到我的控制器(项目)的参数未定义。我需要这个实际传递来自我的指令中的变量的数据,以便在我将在控制器中运行的函数中使用。
指令模板文件
<div class="tsProductAttribute"
ng-class="{'tsProductAttribute--selected': selected}"
ng-click="toggleState(item)">
<span class="tsProductAttribute-image">
<img ng-src="{{variantImage}}">
</span>
<span class="tsProductAttribute-desc">{{item.productName}}</span>
<select ng-model="variantImage">
<option ng-repeat="variant in item.variants" value="{{variant.image}}">{{variant.name}} - {{variant.listprice.amount}}</option>
</select>
<span class="tsProductAttribute-price">{{item.variants[0].listprice.amount}} {{item.variants[0].listprice.entity}}</span>
</div>
指令
angular.module('msfApp')
.directive('listitem', function () {
return {
templateUrl: 'assets/templates/directives/listitem.html',
restrict: 'E',
scope: {
'item': '=',
'itemClick': '&'
},
link: function(scope, iElement, iAttrs) {
scope.selected = false;
scope.toggleState = function(item) {
scope.selected = !scope.selected;
scope.itemClick(item);
}
}
}
});
指令实施
<listitem item="item" item-click="toggleInBasket(item)"></listitem>
控制器中的功能
$scope.toggleInBasket = function(item) {
$scope.basket.toggle(item);
console.log(basket.get());
}
(item)未定义
答案 0 :(得分:6)
在将函数传递给指令隔离范围时,您应该使用&
(表达式绑定)来传递方法引用。在item-click
上,您应该提到对toggleInBasket(item)
<强>标记强>
<listitem item="item" item-click="toggleInBasket(item)"></listitem>
然后在从指令调用方法时,您应将其称为scope.itemClick({item: item})
<强>指令强>
angular.module('msfApp').directive('listitem', function () {
return {
templateUrl: 'listitem.html',
restrict: 'E',
scope: {
'item': '=',
'itemClick': '&' // & changed to expression binding
},
link: function(scope, iElement, iAttrs) {
scope.selected = false;
scope.toggleState = function(item) {
scope.selected = !scope.selected;
scope.itemClick({item: item}); //changed call to pass item value
}
}
}
});