如果我将选择(select.js)下拉列表放在ngTable中,并尝试从表外显示选择,则会丢失其范围并且不显示选择。希望我能够解释这一点。
这是预览。在预览中,您将看到一个具有两个输出位置的选择下拉列表。桌子里面有一个可以工作,另一个在桌子外面没有。
答案 0 :(得分:1)
我解决了你的问题,这与范围的等级有关。
(首先,你为什么把Select控件放在表中?它们不是表数据,因此它们不会进入<table>
标签。)
您正在使用创建自己范围的ngTable
指令。所以你的Select在两个范围内,如下:
[DemoCtrl scope] -> [ngTable scope] -> [Select]
selectedIcon
在DemoCtrl
范围内定义。
你遇到了一个常见的问题。当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();
};