此问题是Angular JS - Update input options with other input options
的扩展我有两个ng-model
输入(输入选项),一个位于ng-view
内,另一个位于ng-include
内。我想在更改时保持更新,因此两者显示的值始终相同。
当两个输入处于同一级别时,代码正在运行。当一个输入位于ng-include
内时,我设法通过将$parent
添加到ng-model
范围来使其正常工作,但是当将其他输入放在ng-view
内时我无法设置让它工作。您可以查看我的代码in this plunkr
答案 0 :(得分:1)
你有一个设有ng-ctrl
的div。这个div现在有一个范围,其实例为myCtrl
。
ng-include
创建一个子作用域,它继承自其父作用域(以前创建的myCtrl
作用域)。此范围不会直接引用selectedCountry或国家/地区,但 angular会在找不到值时自动搜索父范围。 这很重要。 (这就是JavaScript原型继承的工作原理。更多信息here。)
你还有一个ng-view
,你告诉你的路由提供者将其控制器设置为myCtrl。这意味着它将创建一个单独的myCtrl
范围,该范围也是外部myCtrl
范围的子节点。因为它是外myCtrl
范围的子项,就像您的ng-include
范围一样,angular通常会在其父项中搜索它在直接范围内找不到的属性。
然而,这是变得复杂的地方。在这种情况下,因为它也是myCtrl
的另一个实例,它为自己创建了selectedCountry
和countries
的新属性,因此在引用时不需要在其父级中搜索属性他们。 Angular通过引用匹配对象,而不是通过深度对象比较,因此这些对象被认为是不同的并从列表A中选择某些内容将selectedCountry
更改为对象的引用t列在清单B上。
这就是为什么你被迫使用$parent
来尝试指向与它之外的范围相同的引用,ng-include
通过其父级自动引用它。
您的代码的第二个问题是,当您使用$parent
代表selectedCountry
值时,不使用$parent
代表countries
}数组,因此它使用在子myCtrl
上重新创建的对象数组来填充您的选择框。同样,即使对象具有相同的值,角度也会通过引用比较ng-options
。因此,选择A上的Modor
与选择B上的Modor
不同。
作为补充说明,如果您未在$parent
为menu.html和checkout.html设置selectedCountry
,则可能会遇到第三个问题。虽然最初会搜索父项selectedCountry
,但是如果你更改了select,它会在子范围上创建一个属性而不是冒泡到父级,因此从那时起它将不再匹配父级的版本selectedCountry
。
所以,总而言之,你编码它的方式有两个选择。
废话选择:
$parent.everything
$parent
controllerAs
修复所有内容(请不要这样做)负责任的选择:
controllerAs
来防止确定范围问题controllerAs
ng-controller="myCtrl as myCtrl"
的简短指南是Plunkr
TL; DR;如果你不想阅读指南
myCtrl.countries
controllerAs: 'myCtrl'
$scope.stuff
this.stuff
- > this
$scope
用于属性/功能分配。如果您使用$watch
这样的$scope
函数,则仍在{{1}}上完成。就像额外提示一样,这是我的here用于角度编码。遵循这些准则,您的代码将是完美无暇的,并防止您遇到这些陷阱。