Angular для обновления массива после обновления полей через модальный экземпляр

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

    }
);