Почему ng-click не работает в моей директиве и как мне добавить класс переключения?
Я создал директиву в Angular, которая выглядит следующим образом:
angular.module('msfApp')
.directive('listitem', function () {
return {
templateUrl: 'assets/templates/directives/listitem.html',
restrict: 'E',
scope: {
'item': '='
}
}
});
И шаблон выглядит так:
<div class="tsProductAttribute" ng-click="toggleInBasket(item)">
<span class="tsProductAttribute-image">
<img ng-src="{{item.variants[0].image}}">
</span>
<span class="tsProductAttribute-desc">{{item.productName}}</span>
<span class="tsProductAttribute-price">{{item.variants[0].price[0].amount}} {{item.variants[0].price[0].entity}}</span>
</div>
Но теперь у меня есть два вопроса:
- Функция ng-click не срабатывает в моем контроллере,
toggleInBasket(item)
, это почему? - И во-вторых, как добавить поведение переключателя к элементу списка, чтобы оно переключало класс с именем "tsProductAttribute - selected"
Заранее спасибо, ребята!
3 ответа
1) Проблема в изолированной сфере. Вы не можете увидеть функцию в области видимости контроллера. Одним из решений является передача ссылки на функцию в директиву:
http://plnkr.co/edit/GorcZZppa8qcIKbQAg2v?p=preview
<body ng-controller="ItemController">
<listitem item="item" item-click="toggleInBasket(item)"></listitem>
</body>
в директиве:
scope: {
'item': '=',
'itemClick': '&'
}
и в шаблоне:
<div class="tsProductAttribute" ng-click="itemClick(item)">
2) Создайте еще одну функцию в директиве для переключения выбранного состояния и вызовите функцию контроллера:
angular.module('msfApp').directive('listitem', function () {
return {
templateUrl: '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);
}
}
}
});
и переключить класс в шаблоне:
<div class="tsProductAttribute"
ng-class="{'tsProductAttribute--selected': selected}"
ng-click="toggleState(item)">
Ответ @Macros заставил меня работать очень хорошо! Вот мой законченный код:
Директивный файл шаблона:
<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"></listiten>
Функция в контроллере:
$scope.toggleInBasket = function(item) {
$scope.basket.toggle(item);
console.log(basket.get());
}
Это происходит потому, что в директиве вы используете изолированные области действия, используя scope: { 'item': '=' }, который создает новую область видимости, поэтому ваш щелчок по ng не может привязаться к функции контроллера.
Пожалуйста, обратитесь к ссылке ниже, чтобы вызвать родительскую функцию с помощью ng-click.
вызов метода родительского контроллера из директивы AngularJS