#javascript #arrays #angularjs
#javascript #массивы #angularjs
Вопрос:
Для редактирования сведений об объекте я использую модальную директиву ui bootstrap. Я использую тот же контроллер для добавления нового объекта или редактирования уже существующего. В моем текущем коде, когда я добавляю новый объект, он помещается в массив. Теперь у меня проблема при обновлении существующего объекта. Мой текущий код также помещает обновленный объект в массив, но не в базу данных, и показывает мне дубликат старой записи и новую в массиве. После обновления старый, конечно, исчезает, потому что контроллер снова запрашивает фактический массив.
$scope.openSaleDlg = function (saleId) {
var modalInstance = $modal.open({
backdrop: 'static',
templateUrl: '/sales/detail.html',
controller: 'SaleDetailCtrl',
scope: $scope,
resolve: {
saleId: function () {
return saleId;
}
}
});
modalInstance.result.then(
function (sale) {
$scope.sales.push(sale)
}
);
};
Я мог бы иметь .затем сделайте $scope.sales = Sale.query();
в случае успеха, но, может быть, есть лучший способ просто обновить объект в списке, не запрашивая базу данных снова?
Комментарии:
1. Не могли бы вы просто найти элемент в списке по идентификатору и расширить его, если он существует, вместо того, чтобы помещать его в массив?
2. Пример был бы оценен. Не очень знаком с этим методом.
Ответ №1:
Вы могли бы поступить так, как вы предлагаете, и обновить объект в списке, если он существует, вместо того, чтобы нажимать на него. Angular примет изменения и повторно отобразит.
Что-то вроде:
modalInstance.result.then(function (sale) {
var saleToUpdate = $scope.sales.find(function (existingSale) {
return existingSale.id == sale.id;
});
if (saleToUpdate) {
angular.extend(saleToUpdate, sale);
} else {
$scope.sales.push(sale);
}
});
Обратите внимание, что Array#find
для этого потребуется полизаполнение (или вы могли бы использовать другой метод для поиска в массиве).
Ответ №2:
Я предлагаю вам сохранить индекс ‘sale’ следующим образом:
$scope.openSaleDlg = function (sale) {
var modalInstance = $modal.open({
backdrop: 'static',
templateUrl: '/sales/detail.html',
controller: 'SaleDetailCtrl',
scope: $scope,
resolve: {
saleId: function () {
return sale.Id;
}
}
});
$scope.saleIndex = $scope.sales.indexOf(sale)
modalInstance.result.then(
function (sale) {
if($scope.saleIndex >-1){
$scope.sales[$scope.saleIndex] = sale;
}
else{
$scope.sales.push(sale)
}
}
);