ngOptions:选择提取的值或选择默认值

时间:2016-11-15 09:06:59

标签: angularjs ng-options

在查看有关SO的文档和众多问题之后,我无法找到解决问题的方法。我有一个下拉列表,其中填充了数据库中的数据。为了填补这一点,我使用了select as方法的ngOptions。

<select ng-model="modelthing" ng-options="item.id as item.description for item in categories">

现在我想要的是一个默认选项(可以由管理员更改,因此如果之前没有选择任何值,则无法将其硬编码为<option>),以及当选择的值时还有其中一个。

$scope.categories = $http.get(thingurl)
    .then(function (result) {
        $scope.categories = result.data;
        //$scope.modelthing= $scope.categories[1].id; 
        $scope.modelthing= 1; 
    });

这有两个问题,首先[1]选择json数据中的第二个条目,而不是1作为键的条目。 第二:Solved this with help from Icycool in their comment below.

当我持续打开和关闭填充表单大约一半的时间时,我得到默认值,而另一半我得到实际选择的值。这显然是因为当我从填充的表单中获取数据并且代码运行同步时,ng-model="modelthing"被覆盖。有没有办法确保它运行异步?或者我的方法是否完全错误?

到目前为止我尝试过的其他事情:

我注意到,当我在ngOptions中使用select as item in items词组时,我的select中的选项包含value="number:3"而不是普通数字。 Using track by in ngOptions而不是select as修正了此问题,但我的选定值与下拉列表中的值不匹配,因此具有不可预见的影响,因为这些值是3而不是number:3 1}}。

工作的解决方案,但感觉非常无意义且有点脏,是在modelthing模型为空时检查表单初始化,如果是,请将其设置为默认值。

2 个答案:

答案 0 :(得分:1)

使用id比使用对象本身更容易管理。

<select ng-model="modelthing" 
        ng-options="item.id as item.description for item in categories">

$scope.categories = $http.get(thingurl)
    .then(function (result) {
        $scope.categories = result.data;
        $scope.modelthing = 1; // your model is bound to id not the object
    });

请注意,在这种情况下,integer 1string "1"可能不会被视为相同,它需要与JSON中返回的类型相匹配。

第2部分:您的意思是模型和选择来自不同的$http来电吗?可以通过在应用默认值

之前检查现有值来修复它
function getData() {
  $http.then(function(data) {
    $scope.selections = data;
    if (!$scope.selected) $scope.selected = data[0].id;
  })
}

function getSelected() {
  $http.then(function(data) {
    $scope.selected = data.id;
  })
}

通过这种方式,异步调用resolve之后的最终值将始终是检索到的id,无论顺序如何。

剩下的唯一小问题是默认值会显示片刻,直到真正的选定值返回。您可以保留此行为或隐藏选择,直到所选值返回。

答案 1 :(得分:0)

  
      
  • 您需要在数组 (类别)中添加新对象(带负值或0)

  •   
  • 将最后一个对象分配给模型 (modelthing)对象。

  •   

请尝试以下代码(否则将其转到密钥)

$scope.categories = $http.get(thingurl)
    .then(function (result) {
        $scope.categories = result.data;
        $scope.categories.Push(id:"0",description:"Select");
        $scope.modelthing = $scope.categories[$scope.categories.length - 1];
    });

<强>更新

  

1)这有两个问题,首先[1]选择json数据中的第二个条目,而不是选择1作为键的那个

索引数组从0开始,而不是1.因此,如果键看起来为1但索引值为0. 您正在使用数组而不是 arraylist 。有意义吗?

只需输入0而不是像

一样

$scope.categories[0].id

  

2)当我持续打开和关闭填充表单大约一半时间时,我得到默认值,而另一半我得到实际选择的值。这显然是因为当我从填充的表单中获取数据并且代码同步运行时,ng-model =“modelthing”会被覆盖。有没有办法确保它运行异步?或者我的方法是否完全错误?

只需使用空数据

全局声明模型对象
$scope.categories = [];
$scope.modelthing = {};

更新2

  

3)我试图根据其键选择一个值,而不是它在数组中的位置,因为键不一定按升序排列在数组中

var key = 1; //it's not static 
for( var i=0;i<$scope.categories.length;i++)
{
  if($scope.categories[i].id==key)// Once your key is correct,then the value will be assign
  {
    $scope.modelthing = $scope.categories[i]
  }
}