Как обновить значения ng-repeat в angular js?
Я новичок в angular js, у меня есть массив, который я зацикливаю через ng-repeat
директива, и я написал код для копирования, удаления и редактирования значений в массиве.
Если я хочу удалить или скопировать, я могу это сделать, готово? Но если я нажму на edit, появится всплывающее окно, я хочу отредактировать значения, которые эти обновленные значения должны обновить в массиве.
как я могу это сделать?
<!doctype html>
<html>
<head>
<title>Angular app</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.17/angular.min.js">
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<style type="text/css">
.listv{
margin-bottom: 30px;
}
.editpopup{
width: 250px;
height: 250px;
border: 1px solid black;
display: none;
position: absolute;
top: 0px;
left: 0px;
bottom: 0px;
right: 0px;
background-color:gray;
}
.editpopup-true{
display: block;
}
.editpopup-false{
display: none;
}
</style>
</head>
<body ng-app="myApp">
<div ng-controller="myCon">
<div ng-repeat="s in items" class="listv">
<span>{{s.id}}</span>
<span>{{s.pname}}</span>
<button ng-click="removeStudent($index)">remove</button>
<button ng-click="copyrow($index)">copy</button>
<button ng-click="editrow($index)">edit</button>
</div></br>
<div class="editpopup editpopup-{{istrue}} ">
<p>edit id:<input type="text" ng-model="editedid"></p>
<p>edit pname:<input type="text" ng-model="editedname"></p>
<button ng-click="save($index)">save</button>
<button ng-click="closepopup()">cancel</button>
</div>
</div>
var myApp=angular.module('myApp',[]);
myApp.controller('myCon',function($scope){
$scope.items=[{id:1,pname:'box1'},{id:2,pname:'box2'}, {id:3,pname:'box3'}];
$scope.removeStudent=function($index){
$scope.items.splice($index,1);
}
$scope.copyrow=function($index){
$scope.len=$scope.items.length;
$scope.ids=$scope.items[$index].id;
$scope.pnames=$scope.items[$index].pname
$scope.items.push({
id:$scope.len+1,
pname:$scope.pnames
});
}
$scope.editrow=function($index){
$scope.istrue=true;
$scope.editedid=$scope.items[$index].id;
$scope.editedname=$scope.items[$index].pname;
}
$scope.closepopup=function(){
$scope.istrue=false;
}
$scope.save=function($index){
$scope.istrue=false;
$scope.s.name=$scope.editedname;
}
});
здесь jsfiddle
4 ответов
самый простой способ-это использовать угловое.копия чтобы создать клон объекта при нажатии кнопки Изменить, а затем при нажатии кнопки Сохранить скопируйте данные в элемент массива.
первый initilize $scope.editedItem
$scope.editedItem = {};
на editrow
мы храним текущий отредактированный индекс в $index, а затем клонируем данные в $scope.editedItem
.
$scope.editrow = function($index){
$scope.istrue = true;
$scope.$index = $index;
angular.copy($scope.items[$index], $scope.editedItem);
}
затем в save
мы клонируем данные обратно в объект в массиве:
$scope.save = function(){
$scope.istrue = false;
angular.copy($scope.editedItem, $scope.items[$scope.$index])
}
посмотреть необходимо обновить, чтобы вместо этого использовать editedItem
:
<div class="editpopup editpopup-{{istrue}} ">
<p>edit id:<input type="text" ng-model="editedItem.id"></p>
<p>edit pname:<input type="text" ng-model="editedItem.pname"></p>
<button ng-click="save()">save</button>
<button ng-click="closepopup()">cancel</button>
</div>
у меня была такая же проблема. вот мое исправление
мой исходный код, который не обновить объект
<div class="info" ng-repeat="email in vm.contactData.emails.other">
<input type="text" ng-model="email" />
</div>
использовал элементы $index для правильной привязки его
<div class="info" ng-repeat="email in vm.contactData.emails.other">
<input type="text" ng-model="vm.contactData.emails.other[$index]" />
</div>
эта привязка создает проблему повторного рисования, потому что она не знает, ссылается ли обновленный элемент в массиве на тот же элемент, который был в этом месте раньше. Чтобы исправить это, мне пришлось внести небольшое изменение в форматирование массива.
['email1@google.com','email2@google.com']
становится
[
{'email': 'email1@google.com'},
{'email': 'email2@google.com'}
]
и
<div class="info" ng-repeat="email in vm.contactData.emails.other">
<input type="text" ng-model="vm.contactData.emails.other[$index]" />
</div>
становится
<div class="info" ng-repeat="email in vm.contactData.emails.other">
<input type="text" ng-model="vm.contactData.emails.other[$index].email" />
</div>
после этих изменений вы должны иметь правильную привязку без каких-либо проблем повторного рисования, когда поле ввода теряет фокус.
во-первых, сохраните старое значение следующим образом:
$scope.editrow=function($index){
$scope.istrue=true;
$scope.oldValue = $scope.items[$index].id; // save the old id
$scope.editedid=$scope.items[$index].id;
$scope.editedname=$scope.items[$index].pname;
};
затем, когда вы сохраняете, просто найдите правильный объект с помощью старого значения и назначьте новые значения, такие как:
$scope.save=function($index){
$scope.istrue=false;
$scope.items.forEach(function (item) {
if(item.id == $scope.oldValue){
item.id = $scope.editedid;
item.pname = $scope.editedname;
}
});
};
сначала объявить переменную $scope.getIndex=0;
и получить индекс из массива элементов при нажатии кнопки Сохранить. Назначить $index
переменной.
теперь вы можете получить items[$scope.getIndex]
контроллер в любом месте. И поможет вам обновить массив элементов:
$scope.getIndex=0;
$scope.editrow=function($index){
$scope.getIndex=$index;
$scope.istrue=true;
$scope.editedid=$scope.items[$index].id;
$scope.editedname=$scope.items[$index].pname;
}
$scope.save=function($index){
$scope.istrue=false;
$scope.items[$scope.getIndex].id=$scope.editedid;
$scope.items[$scope.getIndex].pname=$scope.editedname;
}[enter link description here][1]