【问题标题】:ngOptions: select fetched value OR select default valuengOptions:选择获取的值或选择默认值
【发布时间】:2016-11-15 18:20:53
【问题描述】:

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

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

现在我想要的是一个默认选项(可以由管理员更改,因此它不能硬编码为&lt;option&gt;),如果之前没有选择任何值,并且当有一个值时选择值那些。

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

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

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


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

我注意到当我在 ngOptions 中使用 select as item in items 短语时,我的选择中的选项有一个 value="number:3" 而不是一个普通的数字。 Using track by in ngOptions 而不是 select as 解决了这个问题,但有不可预见的影响,我选择的值与下拉列表中的值不匹配,因为这些是普通的 3 而不是 number:3

一个确实工作的解决方案是,如果modelthing 模型为空,则检查表单初始化是否为空,如果是,则将其设置为默认值.

【问题讨论】:

  • 用你的 json 数据更新帖子。

标签: angularjs ng-options


【解决方案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
    });

注意integer1string"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;
  })
}

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

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

【讨论】:

  • 啊,是的,你是对的,这是声明 ng-model 的正确方法。谢谢!虽然它不能解决同步调用......这个声明和抓取整个模型的声明显然并排运行,有时会显示默认值,有时会显示所选值。 :(
  • 行得通!这是一种公认​​的“角度方式”吗?你确定这会使调用异步吗?例如,如果 getData() 函数在 getSelected() 开始之前意外结束,那么此时 $scope.selected 的值是否仍为空? (我的意思是,我似乎无法打破它。到目前为止完美无缺,这只是出于好奇)。谢谢!
  • @Kablam 实际上$http 默认是异步的。您的问题是 2 个异步调用以不同的顺序返回,但不是代码有时运行异步,有时运行同步。如果selectionsselected之前返回,Angular会先显示默认值,然后自动返回时更新为真实值,这就是我在上一段描述的问题。
  • 我明白了!太感谢了! :)
【解决方案2】:
  • 您需要在您的数组 (类别)中添加一个新对象(负值或0)

  • 将最后一个对象分配给您的 model (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作为key的那个

索引数组从 0 开始,而不是从 1。所以如果键看起来是 1 但索引值为 0。您使用的是 array 而不是 arraylist em> 。有意义吗?

只放 0 而不是像 1 一样

$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]
  }
}

【讨论】:

  • 这对默认值“选择”有效。我想要的是从我从服务器获取的数据集中预先选择一个值,我想将下拉列表设置为(例如)key = 3 的值。
  • 是的,我现在明白了,我明白你想说的话。我知道一个数组从 0 开始。我试图根据它的键而不是它在数组中的位置来选择一个值,因为键不一定按升序放置在数组中。
  • 非常感谢您的帮助,感谢您花时间回复。但是,尽管您的 Update 2 解决方案确实选择了正确的值,但它与@Icycool 的解决方案基本相同,尽管更复杂一些。我当前的问题如开始帖子中所述;数据被同步调用,导致显示正确值时出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
相关资源
最近更新 更多