Angular 1.4 - Как переместить логику для элемента ng-click из шаблона в контроллер?

Я хочу изменить код, чтобы добавить больше функциональности к событию ng-click, которое находится внутри ng-repeat.

Текущий код обновляет выбранное свойство для элемента в списке:

<li ng-repeat="value in facet.values" ng-click="value.selected = (value.selected == 0) ? 1 : 0; accountSearch()">
  ...
</li>

Я хотел бы обновить выбранное свойство, но также вызвать событие для нашего поставщика аналитики:

<li ng-repeat="value in facet.values" ng-click="itemClicked(value)">
  ...
</li>

Тогда в моем контроллере:

$scope.itemClicked = function(value){
  value.selected = (value.selected == 0) ? 1 : 0; $scope.accountSearch();
  // do other things
}

Проблема заключается в том, что приведенный выше код не будет фактически изменять выбранное свойство в шаблоне. Как я могу восстановить это поведение, но перенести логику в контроллер?

2 ответа

Решение

Значение не возвращается в шаблон, поэтому оно теряется. Попробуйте следующее:

<li ng-repeat="value in facet.values" ng-click="itemClicked($index)">
  ...
</li>


$scope.itemClicked = function(index){
  $scope.facet.values[index].selected = ($scope.facet.values[index].selected == 0) ? 1 : 0; 
  $scope.accountSearch();
}

Причина, по которой он не обновляется, заключается в том, что он, вероятно, больше не связан с моделью. Попробуй это:

<li ng-repeat="value in facet.values" ng-click="itemClicked(value)">
  <input type="checkbox" ng-model="value.selected" />
</li>

Вы можете использовать ng-checked вместо ng-model на основе вашего варианта использования

Другие вопросы по тегам