2015-04-21 3 views
0

Я следующий контроллер в AngularJS:AngularJS - старое значение имущества отправлено на сервер

$scope.model = null; 
$scope.load = function() { 
    $http.get(someUrl).success(function (data) { 
       $scope.model = data; 
    } 
} 

$scope.save = function() { 
     $http.post(url, $scope.model) 
      .success(function (data) { 
       // some handle 
      }).error(function() { 
       // some handle 
      }); 
} 

Схема модели:

$scope.model.PayDate === "2015-04-29T22:00:00.000Z" 
// deserialized from request, date is in ASP.NET format 

Далее PayDate опора крепится к некоторому контролю (через ng-model), который устанавливает новую дату в javascript DateTime class. Таким образом, значение изменилось PayDate перед отправкой на сервер выглядит следующим образом:

value

К сожалению, когда запрос отправляется на сервер, значение PayDate старый один:

val

Зачем старое значение PayDate отправлено вместо текущего, хранящегося в модели?

EDIT: Чтобы обойти эту проблему, чтобы преобразовать дату в строку JS перед отправкой:

$scope.model.PayDate = moment($scope.model.PayDate).format("YYYY-MM-DD"); 
$scope.save(); 

Затем новое значение отправить в запросе.

Конечно, я хотел бы исправить проблему, а не преобразовывать каждое поле даты в строку непосредственно перед отправкой.

+1

Является ли управление созданием детской области? –

+0

Как я могу это проверить? Я использую https://github.com/dalelotts/angular-bootstrap-datetimepicker в качестве выбора времени. –

+0

Раньше у меня были проблемы из-за времени. Не уверен, что это аналогичная проблема. – ryanyuyu

ответ

0

Я думаю, что у вас возникли проблемы с часовым поясом, вас» re in (poland UTC + 2?)

Вы имеют дело с Javascript Date, который находится в текущей TimeZone GMT + 2 Таким образом, вы будете видеть Thu Apr 30 2015 00:00:00 GMT+0200, но как только он отправляет ее обратно на сервер его послал как ISOString

new Date("2015-04-29T22:00:00.000Z")

выход: Thu Apr 30 2015 00:00:00 GMT+0200 (YOUR TIMEZONE)

new Date("2015-04-29T22:00:00.000Z").toISOString()

выход: "2015-04-29T22:00:00.000Z"

Так т шланги 2 даты на самом деле одинаковы

+0

Звучит очень разумно. Я посмотрю. –

+0

Подтверждено - проблема была часовым поясом. –

0

Возможно, попробуйте ввести $ timeout в контроллер. Так таймаут делает переваривать цикл первого, а затем разместить свои данные ..

$scope.save = function() { 
    $timeout(function(){ 
    $http.post(url, $scope.model) 
     .success(function (data) { 
      // some handle 
     }).error(function() { 
      // some handle 
     }); 
    }); 
}; 

Решает ли это проблему?

+0

Нет, та же проблема возникает. –

+0

Но для меня проблема ушла – iuridiniz

0

Я думаю, проблема в том, что ваша директива создает дочернюю область с ее собственной переменной, которая не изменяет родительскую. Вы можете проверить this answer с той же ситуацией.

** Обновление после обновления JS Струнный **

От documentation

Работа с нг-модели

Директива углового самозагрузки-DateTimePicker требует нг-модели и ОТМЕЧЕННЫХ дата/время автоматически синхронизируется с моделью .

Эта директива также хорошо сочетается с директивами валидации, такими как ng-required.

углового-самозагрузка-DateTimePicker директива хранит и рассчитывает значение модели быть стандартного объектом Javascript Даты.

Попробуйте использовать DateObject вместо строки

Таким образом, вместо

$scope.model.PayDate === "2015-04-29T22:00:00.000Z"; 

Использование

$scope.model.PayDate === new Date("2015-04-29T22:00:00.000Z"); 
+0

Возможно, но у меня только один контроллер в моем html. Таким образом, похоже, что у плагина для выбора даты есть ошибка внутри. –

+0

BTW. Преобразование даты в строку исправляет проблему (см. Мое редактирование). Так что, может быть, области создаются правильно? –

+0

Но Док говорит, что ждет объект Date. Я обновляю свой ответ –

Смежные вопросы