#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).