Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS选择框在模型更改时不更新_Javascript_Angularjs - Fatal编程技术网

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"....