0

如果我将 Selects (select.js) 下拉列表放在 ngTable 中,并尝试从表外显示选择,它将失去其范围并且不显示选择。希望我能够解释这一点。

这是预览。在预览中,您将看到一个具有两个输出位置的选择下拉列表。一个在表内有效,另一个在表外无效。

http://plnkr.co/edit/tQYmRrTjXOhTohsESpNo?p=preview

4

2 回答 2

1

我解决了你的问题,它与范围级别有关。

(首先,为什么要把Select控件放在表格里面呢?它们不是表格数据,所以不放在<table>标签里面。)

您正在使用ngTable创建自己的范围的指令。因此,您的 Select 处于两个范围内,如下所示:

[DemoCtrl scope] -> [ngTable scope] -> [Select]

是在范围selectedIcon上定义的。DemoCtrl

您遇到了一个常见问题。当 select 查找时selectedIcon,它会向上搜索继承级别并找到它。因此它可以读取父/祖先范围的属性。但它不能写信给他们。相反,您的 Select 创建/更改ngTable范围上的属性,它外部的绑定看不到该属性。

出于这个原因,AngularJS 建议您引用对象,而不是使用in 中的值。ngModel因为 Javascript 中的对象总是通过引用。所以这里是修复:

不正确:

ng-model="selectedIcon"

正确的:

ng-model="obj.selectedIcon"

obj作为您在DemoCtrl范围内创建的对象。

前几段很好地解释了这种现象:https ://github.com/angular/angular.js/wiki/Understanding-Scopes

于 2014-01-21T22:28:13.100 回答
0

有用。这是我必须做的。我不得不修改 angular-strap.js。将 scope.$apply() 添加到以下代码中。

$select.update = function (matches) {
  scope.$matches = matches;
  if (controller.$modelValue && matches.length) {
    if (options.multiple && angular.isArray(controller.$modelValue)) {
      scope.$activeIndex = controller.$modelValue.map(function (value) {
        return $select.$getIndex(value);
      });
    } else {
      scope.$activeIndex = $select.$getIndex(controller.$modelValue);
    }
  } else if (scope.$activeIndex >= matches.length) {
    scope.$activeIndex = options.multiple ? [] : 0;
  }
  scope.$apply();
};
于 2014-01-29T16:13:07.933 回答