2015-09-19 2 views
3

Поэтому у меня есть контроллер, как этотAngularJS Выберите окно не обновляется при изменении модели

app.controller("ReservationCtrl", function($scope) { 

    $scope.rooms = [{id: 1, name: "Room 1"}, {id: 2, name: "Room 2", }]; 
    $scope.reservation = {id: 1, time: "9AM", room: {id: 2, name: "Room 2"}}; 

}); 

мнение, что выглядит следующим образом:

<select ng-model="reservation.room" ng-options="room as room.name for room in rooms"></select> 

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

$scope.reservation.room = $scope.rooms[1]; 

Это довольно неудобно для развития, поскольку комната не является единственным fi eld на модели reservation, которая должна быть привязана к выделенной области. Как я могу применить привязку, не делая этого дополнительного шага?

Кроме того, обязательные перерывы снова, если я что-то вроде

$http.get("/reservation/2").success(function(data) { $scope.reservation = angular.copy(data); }); 

ответ

2

Так что, по-видимому, ключом к этой проблеме является статья track by в директиве ng-options. См. Мой updated fiddle Как вы увидите, вся модель обновляется, а не только ее идентификатор. В документации указано, что select as и track by не предназначены для совместного использования, но пример, который они использовали для иллюстрации, немного отличается от моего.

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

Спасибо за помощь всем.

1

Когда вид загружен, выберите поле не имеет выбранное значение, так как объект номер в $scope.reservation не тот же объект, как тот, в $scope.rooms, событие, если оно имеет одинаковые значения.

Вот почему ваш пример не работает (fiddle)

Но это работает:

$scope.rooms = [{id: 1, name: "Room 1"}, {id: 2, name: "Room 2"}]; 
$scope.reservation = { 
    id: 1, 
    time: "9AM", 
    room: $scope.rooms[1] // <-- now the reservation room references a valid ng-repeated room 
}; 

См updated fiddle


Чтобы избежать проблем, я буду предложите привязать переменную вашего окна выбора к в номере номер брони. Поскольку это примитивный тип, сравнение будет производиться по значению, и это решит и ваш второй вариант использования. Более того, лучше не дублировать данные в объекте резервирования. См. fiddle

Если вам нужно отобразить имя зарезервированной (выбранной) комнаты, вы можете легко написать функцию getRoomById, которая будет изучать массив комнат.

+0

Это нормально, но как мне получить автоматическое связывание для моего второго варианта использования, когда я назначаю значение объекта «резервирования» посредством возврата вызова $ http? – kshep92

+0

С вашей конфигурацией элемента '