Javascript AngularJS选择框在模型更改时不更新
我有一个这样的控制器Javascript AngularJS选择框在模型更改时不更新,javascript,angularjs,Javascript,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-mod
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>
这对于开发来说相当不方便,因为房间不是预订
模型上需要绑定到选择框的唯一字段。如何在不执行此额外步骤的情况下应用绑定
而且,如果我做类似的事情,绑定会再次中断
$http.get("/reservation/2").success(function(data) { $scope.reservation = angular.copy(data); });
加载视图时,选择框没有选定值,因为
$scope.reservation
中的房间对象与$scope.rooms
中的房间对象不同,如果其具有相同的值,则会发生事件
这就是为什么您的示例不起作用()
但这一条有效:
$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
};
$scope.rooms=[{id:1,名称:“room1”},{id:2,名称:“room2”}];
$scope.reservation={
id:1,
时间:“上午9点”,
房间:$scope.rooms[1]/我想这是因为
在ng选项中
如果选择选项,则所选值为对象
EX:如果选择第一个选项,则模型值是一个对象,它是$scope.rooms
中的第一个元素({id:1,name:“room1”}
)
对象是引用类型的数据类型。因此,如果对象只创建一次,那么它的所有用法都指向该对象。看看这个
因此,您选择的值是一个引用类型的对象。在本例中,您有两个独立的对象,分别用于$scope.reservation.room
和{id:2,name:“room 2”}
,它们位于rooms
数组中。请注意,它们位于分开的内存插槽中
在您的工作环境中,$scope.reservation.room
和房间中的{id:2,name:“room 2”}
数组都指向同一个内存插槽,因为这两个内存插槽与$scope.reservation.room=$scope.rooms[1]相等;
这意味着$scope.reservation.rooms
&$scope.rooms[1]
两者都指向内存中的同一对象
为了解决这个问题,你可以做一些不同于你的工作方案的事情
更改ng repeat
,如下所示
...ng-options="room.id as room.name for room in rooms"...
并更改ng型号
....ng-model="reservation.id"....
这将选择选项的id
作为EX的选定值。如果选择第一个选项,则模型值将为1
,这是第一个选项的id
在这种情况下,选定的模型值是原始(如1,2,3..
)类型的数据,因此它不会搜索内存中的对象,而是会获取堆栈的值,并使用选项值进行检查,然后选择正确的值
下面是一个示例,它将首先选择第二个选项
-------------------------------------------------摘要-------------------------------------------------
如果所选模型值是对象
,则它将检查所选对象的内存地址和$scope.rooms
的所有对象,并检查是否存在匹配元素,如果找到匹配元素,则选择匹配选项。如果未找到任何元素,则不会选择任何内容
如果模型值是原始值,如1,2,3..
,它将搜索该值并检查是否有任何匹配的选项
值
,如果找到,它将选择该选项。因此,这个问题的关键似乎是ng options
指令中的track by
子句。请参阅我的
正如您将看到的,整个模型正在更新,不仅仅是它的ID。文档中说,select As
和track by
并不打算一起使用,但他们用来说明这一点的示例与我的有点不同
因为到目前为止,我还没有收到官方Angular频道对此事的反馈,所以我将把这个问题标记为已解决,然后继续
谢谢大家的帮助。这很好,但是如何为我的第二个用例获得自动绑定,在这个用例中,我通过返回$http调用来分配reservation
对象的值?使用
元素的配置,您必须确保$scope.reservation.room
引用了m数组$scope.room
,以便进行绑定。为了避免问题,我建议您在ng模型中仅绑定房间id。因为它是一种基本类型,可以按值进行比较。毕竟,在您的预订对象中,您最好不要重复数据,您只需要房间id。请注意,这可能会导致ld是解决方案,但如果您查看,您将看到使用选择框仅切换模型的一个属性(id)而不是整个模型本身。当我更改整个保留
模型时,您的方法确实解决了绑定断开的问题。请给我更多的时间进一步研究这个问题,或者在我接受这个之前获得更多的答案。因此,这个问题的关键似乎是ng选项中的track by
子句ns
指令。查看my,正如您将看到的,整个模型正在更新,而不仅仅是它的ID。文档中说,选择为
和跟踪方式
不应在同一表达式中使用,因为它们不兼容,但看起来它们对我来说工作正常。。。
....ng-model="reservation.id"....