2015-07-09 3 views
0

У меня есть завод с, который возвращает новый объект:RejectChanges() не отменяет изменения при внесении изменений в новый объект?

//myDataFactory 
//some other code here... 
function create() { 
    return manager.createEntity(entityName); 
} 

В моем контроллере, когда все бэкенд возвращает 404 (не найдено), я просто спусковой механизм, который create() метод, когда контроллер включен, в противном случае я установите объект на все, что было возвращено.

 //myDataController 
     //some other code here... 
     init(); 

     function init() { 
      var promises = [ 
       getMyData() 
      ]; 

      console.log('populating MyData'); 
      return q.all(promises).then(function(){ 
       logger.info('populated MyData.'); 
      }); 
     } 

     function getMyData() { 
      return myDataFactory.getMyData(true).then(
       setMyData, 
       createNewMyData 
      ); 
     } 

     function setMyData(data) { 
      vm.myData = data[0]; 
     } 


     function createNewMyData() { 
      vm.myData = myDataFactory.create(); 
     } 

В пользовательском интерфейсе, у меня есть кнопка отмены, которая просто вызывает эту функцию в myDataController:

function undo() { 
    vm.myData.entityAspect.rejectChanges(); 
    vm.termsForm.$setPristine(true); 
} 

undo() выше функция работает очень хорошо, когда есть объект, возвращаемый из базы данных. Но когда я пытаюсь внести изменения во вновь созданный объект, который еще не сохранен, когда я нажимаю кнопку «Отменить», он не возвращается к исходному значению. Зачем? Как это разрешить? Любая помощь будет принята с благодарностью. : D

Я использую angularjs с бритом.

ответ

1

«Исходные значения» - это значения, которые существующий объект имел до ваших текущих несохраненных изменений.

Новый объект ... один не извлекается с сервера и еще не сохранен ... отсутствует «исходные значения». Он имеет только «текущие значения». Поэтому rejectChanges нечего катиться.

Существуют и другие важные отличия. Посмотрите на thing.entityAspect.entityState.name объекта thing как до, так и после по телефону rejectChanges.

Если состояние «Модифицировано», состояние после этого «Без изменений». Но если состояние «Добавлено», состояние после этого «Отделано» ... означает, что thing больше не находится в кеше EntityManager и созрел для сбора мусора.

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

+0

привет, спасибо за ответ! Теперь ваше объяснение стало более ясным! С помощью метода create() выше, есть ли способ для меня иметь тот же эффект, что и отменить для несохраненных объектов? Как, например, если объект еще не сохранен (как в действительно новом - со всеми значениями пустым), а пользователь вводит некоторые изменения, но решает поразить отмену, он просто вернется в свое совершенно новое состояние? – Petra

+0

Если нет, есть ли способ узнать, является ли объект новым (несохраненным) без вызова в бэкэнд? Возможно, я мог бы просто сделать оператор if, который очищает данные, если объект является новым, иначе вызовите rejectChanges(). – Petra

+0

Моя первоначальная мысль состояла в том, чтобы проверить, не является ли идентификатор положительным числом, достаточно ли это было бы достаточно надежным? – Petra

0

Для тех, кто застрял, вот мое решение, основанное на том, что я собрал из ответа г-на Уорда. Вместо этого я использовал entityState.isAdded().

function undo() { 
    if (myDataIsNew()) { 
     resetMyData(); 
    } else { 
     vm.myData.entityAspect.rejectChanges(); 
    } 
    setPristineForm(); 
} 

function myDataIsNew() { 
    // A new entity in cache that does not exist in the backend database 
    return vm.myData.entityAspect.entityState.isAdded(); 
} 

function resetMyData() { 
    //clear each property. 
}