Javascript 角度-选择框-从控制器设置所选条目

Javascript 角度-选择框-从控制器设置所选条目,javascript,angularjs,Javascript,Angularjs,我有一个选择框,定义如下: <select ng-model="selectedSupplier" ng-options="supplier.name for supplier in suppliers"> </select> 但我将函数更改为这样,它仍然设置选项,但所选选项是新的空白选项,没有我定义的选项: $scope.foo = function() { var foos = [{"id":1,"name":"No 1"},{"id":2,"name"

我有一个选择框,定义如下:

 <select ng-model="selectedSupplier" ng-options="supplier.name for supplier in suppliers">
 </select>
但我将函数更改为这样,它仍然设置选项,但所选选项是新的空白选项,没有我定义的选项:

$scope.foo = function() {
    var foos = [{"id":1,"name":"No 1"},{"id":2,"name":"No 2"},{"id":3,"name":"No 3"},{"id":4,"name":"No 4"}];
    $scope.suppliers = foos;
    $scope.selectedSupplier = {"id":3,"name":"No 3"};
}

这是怎么回事?如何使用原始对象以外的对象设置所选选项?

ngOptions
指令以不同方式处理数组和对象:

这是一个平等/身份问题。文字

 $scope.selectedSupplier = {"id":3,"name":"No 3"};
与foos数组中的对象不同。虽然它们包含相同的数据,但它们是两个不同的引用

$scope.selectedSupplier === foos[2] // false
在第一个示例中,您正确地引用了数组中的对象

$scope.selectedSupplier = foos[2];
在这方面:

$scope.selectedSupplier = {"id":3,"name":"No 3"};
您正在将独立对象分配到
$scope.selectedSupplier
,该对象不在选项列表中。在幕后没有深入的比较——对于复杂对象,必须指定实际对象本身

例如,如果希望基于id属性指定选定值,请使用以下代码:

var idToAssign = 2;
for (var i = 0; i < $scope.suppliers.length; i++) {
    var curSupplier = $scope.suppliers[i];
    if (curSupplier.id == idToAssign) {
        $scope.selectedSupplier = curSupplier;
        break;
    }
}
var idToAssign=2;
对于(变量i=0;i<$scope.suppliers.length;i++){
var curSupplier=$scope.suppliers[i];
if(curSupplier.id==idToAssign){
$scope.selectedSupplier=curSupplier;
打破
}
}

我尝试删除对象键(
id
“id”
)周围的
),因为它在javascript中不是必需的,而且有效

  $scope.foo = function() {
       var foos = [{id:1,name:"No 1"},{id:2,name:"No 2"},{id:3,name:"No 3"},{id:4,name:"No 4"}];
       $scope.suppliers = foos;
       $scope.selectedSupplier = {id:3,name:"No 3"};
  };

如果删除引号没有问题,那么这可能是一个解决方案

您是否可以从列表中查找对象(按id或名称匹配)然后用它来设置selectedSupplier?否则,如果你创建了一个新对象,它们将不匹配,也不会被选中。谢谢你的提示。因为问题显示了一个MCVE,而我遇到相同问题的真实应用程序从服务器接收到一个JSON响应,所以我更喜欢保留引号,因为服务器响应已经关闭您可以将json数据解析为简单的javascript对象,如
json.parse('{“Id”:1,“Name”:“No 1”}')
,它将生成
{Id:1,Name:“No 1”}
  $scope.foo = function() {
       var foos = [{id:1,name:"No 1"},{id:2,name:"No 2"},{id:3,name:"No 3"},{id:4,name:"No 4"}];
       $scope.suppliers = foos;
       $scope.selectedSupplier = {id:3,name:"No 3"};
  };