如果我将 Selects (select.js) 下拉列表放在 ngTable 中,并尝试从表外显示选择,它将失去其范围并且不显示选择。希望我能够解释这一点。
这是预览。在预览中,您将看到一个具有两个输出位置的选择下拉列表。一个在表内有效,另一个在表外无效。
如果我将 Selects (select.js) 下拉列表放在 ngTable 中,并尝试从表外显示选择,它将失去其范围并且不显示选择。希望我能够解释这一点。
这是预览。在预览中,您将看到一个具有两个输出位置的选择下拉列表。一个在表内有效,另一个在表外无效。
我解决了你的问题,它与范围级别有关。
(首先,为什么要把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
有用。这是我必须做的。我不得不修改 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();
};