Доступ к области ng-повтора в функции контроллера

#javascript #angularjs #angularjs-ng-repeat #ng-repeat

#javascript #angularjs #angularjs-ng-repeat

Вопрос:

Скажем, у меня есть

 <div ng-repeat="i in items">
  <span ng-show="editing">i.something</span>
  <span ng-show="!editing">i.something</span>
  <a ng-click="dosomething(i)">click</a>
</div>
  

в контроллере у меня есть:

 $scope.dosomething = function (model){
   //do stuff
   editing = false;
}
  

Как я могу получить доступ к переменной только итерации ng-repeat, я пытался передать редактирование в качестве параметра dosomething я пытался получить к нему доступ через $scope.editing, я просматривал документацию $ rootScope. Не могу с этим справиться.

Я признаю, что мог бы добавить editing в качестве параметра i , но я бы предпочел не трогать модель без необходимости, если есть способ получить доступ к каждой области соответственно без изменения редактирования для других итераций.

Комментарии:

1. какой тип данных содержат ваши элементы? при каком условии вы хотите показать свои данные? ваша часть // do stuff здесь должна содержать условие, для которого вы можете установить для редактирования значение true n false. но я запутался в вашем вопросе, поэтому не могу предоставить вам решение. будьте более ясны с тем, что должно быть достигнуто…

Ответ №1:

Ваша dosomething() функция выполняется в контексте родительской области (таким образом, влияет на все элементы).
Итак, вы должны удалить $scope.editing = false из тела dosomething() .

Затем внутри вашего ngClick выражения вы можете вставить editing=false , которое будет оцениваться в контексте дочерней области, созданной ngRepeat для каждого элемента, и не влияет на другие элементы.

Например.:

 <div ng-repeat="i in items">
    ...
    <a ng-click="editing=false;dosomething(i)">click</a>
</div>

$scope.dosomething = function (model){
    // Do stuff
    // Don't touch `editing` here
}
  

Смотрите также эту короткую демонстрацию.

Комментарии:

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

2. @Kiee: Вы могли бы вернуть значение и настроить редактирование на основе этого: ng-click="editing=dosomething(i)"

Ответ №2:

директива ng-repeat создает дочерние области и привязывает их к каждому элементу «repeat». Таким образом, вы можете получить доступ к своей переменной «редактирования» в дочерней области таким образом.

 $scope.dosomething = function (model){
   //do stuff
 angular.element(model.currentTarget).scope().editing = flase;
}
  

Ответ №3:

Если я правильно понимаю:

 <div ng-repeat="i in items">
  <span ng-show="i.editing">i.something</span>
  <span ng-show="!i.editing">i.something</span>
  <a ng-click="dosomething(i)">click</a>
</div>
  

И в контроллере:

 $scope.dosomething = function (model){
   //do stuff
   model.editing = false;
}
  

Где модель относится к области элемента ng-repeat (i).