Angular-UI Bootstrap 的 typeahead ngmodel 放在选项卡内时无法按预期工作
Angular-UI Bootstrap's typeahead ng-model doens't work as expected when placed inside tabs
我正在使用 angular-ui typeahead 插件如下:
<input type="text" ng-model="selected" uib-typeahead="state for state in states | filter:$viewValue | limitTo:8" class="form-control">
当我把它放在tabs下面的表中表示停止工作时:
$scope.$watch('selected', function(){
console.log($scope.selected);
});
带有我的问题示例的 Plunkr 在这里:http://plnkr.co/edit/65QrdX5DDA9YKenbEUbJ?p=preview
我不认为这是一个错误,但怀疑 <uib-tabset>
创建了自己的范围,但我不知道如何解决这个问题。
UPDATE1:我已经通过使用 $parent
范围解决了这个问题,如下所示:
ng-model="$parent.$parent.selected"
在此处查看更新的 plunkr:http://plnkr.co/edit/65QrdX5DDA9YKenbEUbJ?p=preview
但它寻找我糟糕的解决方法,以我已经解决的方式解决这个问题是否正确,如果不正确,什么是正确的方法?
这是 angular 用户的一个常见陷阱。
您的 <input>
实际上创建了一个独立的范围。你想访问一个共享变量ng-model=your_var
,但它实际上是<input>
范围内的一个私有变量。如果一个指令包含 <ng-swtich>
,它也会创建一个独立的范围。
幸运的是您已经找到了解决方案。是的,您会使用 $parent.your_var
(在某些情况下可能 $parent.$parent
)来设置正确的数据绑定。
顺便说一句:您可能需要安装 angular 浏览器扩展来浏览 angular 范围层次结构。
面向未来的设计总是在 ng-model 绑定中使用 .属性。就像 @Stanelyxu2005 和你自己已经发现的那样,正在创建一个隔离范围。通过创建这样的范围变量
JS
$scope.selected = {city:"" };
$scope.$watch('selected.city', function(){
console.log($scope.selected.city);
});
标记
<input type="text" ng-model="selected.city" uib-typeahead="state for state in states | filter:$viewValue | limitTo:8" class="form-control">
将确保原型链保持真实且永不损坏。这将是比使用丑陋的 $parent.$parent 解决方法更好的方法。看到一个linkhere explaining why using the dot is good practice.
我正在使用 angular-ui typeahead 插件如下:
<input type="text" ng-model="selected" uib-typeahead="state for state in states | filter:$viewValue | limitTo:8" class="form-control">
当我把它放在tabs下面的表中表示停止工作时:
$scope.$watch('selected', function(){
console.log($scope.selected);
});
带有我的问题示例的 Plunkr 在这里:http://plnkr.co/edit/65QrdX5DDA9YKenbEUbJ?p=preview
我不认为这是一个错误,但怀疑 <uib-tabset>
创建了自己的范围,但我不知道如何解决这个问题。
UPDATE1:我已经通过使用 $parent
范围解决了这个问题,如下所示:
ng-model="$parent.$parent.selected"
在此处查看更新的 plunkr:http://plnkr.co/edit/65QrdX5DDA9YKenbEUbJ?p=preview
但它寻找我糟糕的解决方法,以我已经解决的方式解决这个问题是否正确,如果不正确,什么是正确的方法?
这是 angular 用户的一个常见陷阱。
您的 <input>
实际上创建了一个独立的范围。你想访问一个共享变量ng-model=your_var
,但它实际上是<input>
范围内的一个私有变量。如果一个指令包含 <ng-swtich>
,它也会创建一个独立的范围。
幸运的是您已经找到了解决方案。是的,您会使用 $parent.your_var
(在某些情况下可能 $parent.$parent
)来设置正确的数据绑定。
顺便说一句:您可能需要安装 angular 浏览器扩展来浏览 angular 范围层次结构。
面向未来的设计总是在 ng-model 绑定中使用 .属性。就像 @Stanelyxu2005 和你自己已经发现的那样,正在创建一个隔离范围。通过创建这样的范围变量
JS
$scope.selected = {city:"" };
$scope.$watch('selected.city', function(){
console.log($scope.selected.city);
});
标记
<input type="text" ng-model="selected.city" uib-typeahead="state for state in states | filter:$viewValue | limitTo:8" class="form-control">
将确保原型链保持真实且永不损坏。这将是比使用丑陋的 $parent.$parent 解决方法更好的方法。看到一个linkhere explaining why using the dot is good practice.