0

我正在尝试显示从数据存储加载的一些数据,但它没有反映 UI 上的更改。我创建了一个示例来展示我想要实现的目标的一般概念。

http://plnkr.co/edit/MBHo88

这是 angularjs 示例的链接,它们在单击时显示,然后下拉菜单被清除。如果将表达式替换为列表下拉列表中的一种颜色,则选择正确。这种类型的选择是否仅适用于用户事件?

http://docs.angularjs.org/api/ng.directive:select

帮助表示赞赏!

4

3 回答 3

1

实际上问题在于 ngSelect 使用简单的比较运算符 ('==') 比较对象,因此具有相同字段和值的两个对象被视为不同的对象。

因此,您最好使用字符串和数字作为值(ngSelect 指令表达式中的“选择”参数)。

这是您的 plunker 的一种解决方案

另外在 GitHub 上有一些关于这个主题的讨论: https ://github.com/angular/angular.js/issues/1302 https://github.com/angular/angular.js/issues/1032

此外,正如我所指出的,还有一些关于为 ngSelect 添加自定义比较器/散列以便能够更轻松地在对象上使用 ngSelect 的工作。

于 2013-01-07T16:44:45.927 回答
0

控制器初始化中的一个错误。您必须引用 中的对象palette,因为这些对象是在视图中观看的:

$scope.selectedColors.push({col: $scope.palette[2]});
$scope.selectedColors.push({col: $scope.palette[1]});

与您的相同result

$scope.result = { color: $scope.obj.codes[2] };

那你需要看result. 在下面的示例中,选择 1 接收来自初始选择的值,第二个接收调色板中的以下值。我不知道这是否是您想要的,但您可以轻松更改它:

$scope.$watch('result', function(value) {
   if(value) {
      var index = value.color.code -1;
      $scope.selectedColors[0] = {col: $scope.palette[index] };
      $scope.selectedColors[1] = {col: $scope.palette[Math.max(index-1, 0)] };
   }
}, true);

请参阅plunkr

于 2013-01-07T16:53:39.843 回答
0

好的,我想我想通了,但感谢@ValentynShybanov 和@asgoth。

根据 angularjs 示例,ngModel 使用下拉列表中使用的数组中的对象之一进行初始化。所以有一个数组:

$scope.locations = [{ state: 'FL', city: 'Tampa'}, {state: 'FL', city: 'Sarasota'} ....];

下拉列表定义为:

<select ng-options="l.state group by l.city for l in locations" ng-model="city" required></select>

然后 $scope.city 被初始化为:

$scope.city = $scope.locations[0];

到目前为止一切顺利,对吧?!!!.. 但我有多个位置,因此有多个下拉菜单。用户也可以添加/删除更多。就像动态创建表一样。而且,我需要从数据存储中加载数据。

虽然我正在构建并分配一个类似的值(例如:来自数据存储的值 --> State = FL,City = Tampa;因此 --> { state : 'FL', city : 'Tampa' }),但 angularjs 不是能够匹配的值。我尝试了不同的方法,比如只分配 { city : 'Tampa' } or 'Tampa' or and or and or ...

所以我所做的......我知道这有点讨厌,但到目前为止工作......是编写一个查找函数来从 $scope.locations 返回值。因此我有:

$scope.lookupLocation = function(state, city){
   for(var k = 0; k < $scope.locations.length; k++){
      if($scope.locations[k].state == state && $scope.locations[k].city == city)
         return $scope.locations[k];
   }
   return $scope.locations[0]; //-- default value if none matched
}

因此,当我从数据存储区加载数据(json 格式的数据)时,我会调用 lookupLocation 函数,例如:

$scope.city = $scope.lookupLocation(results[indexFromSomeLoop].location.state, results[indexFromSomeLoop].location.city);

这会在加载数据时预先选择我的值。这对我有用。

谢谢

于 2013-01-08T15:46:20.193 回答