Angularjs 在表格中选择droplist将失去其作用域

Angularjs 在表格中选择droplist将失去其作用域,angularjs,angular-strap,ngtable,Angularjs,Angular Strap,Ngtable,如果我将Selects select.js下拉列表放在ngTable内,并尝试从表外显示选择,它将失去其作用域,并且不显示选择。希望我能解释这一点 这是预览。在预览中,您将看到一个具有两个输出位置的选择液滴列表。一个在桌子里面工作,另一个在桌子外面不工作 我解决了你的问题,这与范围的级别有关 首先,为什么要将Select控件放在表中?它们不是表数据,因此不在标记中 您使用的是一个ngTable指令,它创建了自己的作用域。因此,您的选择在两个作用域下,如下所示: [DemoCtrl scope]

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

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


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

首先,为什么要将Select控件放在表中?它们不是表数据,因此不在标记中

您使用的是一个ngTable指令,它创建了自己的作用域。因此,您的选择在两个作用域下,如下所示:

[DemoCtrl scope] -> [ngTable scope] -> [Select]
selectedIcon是在DemoCtrl作用域上定义的

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

因此,AngularJS建议您引用对象,而不是使用ngModel中的值。因为Javascript中的对象始终是通过引用的。下面是解决方法:

不正确:

ng-model="selectedIcon"
正确:

ng-model="obj.selectedIcon"
obj是您在DemoCtrl作用域上创建的对象


前几段很好地解释了这一现象:

它有效。这是我必须做的。我不得不修改angular-strap.js。添加作用域。$应用于以下代码段

$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();
};

我已经更新了预览。它仍然无法显示当前选择。是的,所以有两个问题。你已经修复了第一个,现在你看到的是第二个。如果您注意到,外部绑定会被延迟—在再次更改之前,它不会显示所选内容。所以总是落后一个。这通常是在指令的事件处理程序中缺少$scope.$apply时导致的。您将$apply函数放在何处?在下拉指令中,在处理更改下拉选择的单击的事件处理程序的末尾。当从下拉菜单中进行选择时,我怎么看不到您的示例过滤器?这是可行的,但会引发错误:[$rootScope:inprog]$apply已在进行中。您的插件在哪里。我希望看到你能做同样的事情。