选择ngTable中的droplist失去其范围

时间:2014-01-21 19:58:31

标签: angularjs angular-strap ngtable

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

这是预览。在预览中,您将看到一个具有两个输出位置的选择下拉列表。桌子里面有一个可以工作,另一个在桌子外面没有。

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

2 个答案:

答案 0 :(得分:1)

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

(首先,你为什么把Select控件放在表中?它们不是表数据,因此它们不会进入<table>标签。)

您正在使用创建自己范围的ngTable指令。所以你的Select在两个范围内,如下:

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

selectedIconDemoCtrl范围内定义。

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

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

不正确:

ng-model="selectedIcon"

正确:

ng-model="obj.selectedIcon"

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

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

答案 1 :(得分:0)

有效。这就是我必须做的。我不得不修改angular-strap.js。将范围。$ 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();
};