AngularJs避免范围界定问题
AngularJs Avoiding Scoping Issues
我最近花了4个多小时才弄清楚为什么与ng-options
组合使用的ng-model
指令没有正确绑定到控制器内的属性。<select>
元素正在正确初始化-接收来自控制器(父)作用域的值。但是子作用域没有正确更新父作用域。在检查了以下问题和问题后,我能够为这个问题制定一个"解决方案":
有用的堆叠物流问题1
有用的堆叠物流问题2
基本Plunker
我发现我在<select>
元素中绑定的属性绑定到了控制器的子作用域中的同名属性,因此该值并没有像预期的那样反映在控制器的作用域中。更换后
<select ng-options="asset as asset.Name for asset in allAssets" ng-model="selectedAsset" ng-change="lookupAssetPermissions()"></select>
至
<select ng-options="asset as asset.Name for asset in allAssets" ng-model="$parent.selectedAsset" ng-change="lookupAssetPermissions()"></select>
selectedAsset
中的值已正确绑定到控制器作用域中的属性(如ng-change
事件处理程序中所示)。我的元素的整个上下文如下:
<!---outer div has controller level scope----->
<div>
<!---inner div creates child scope with ng-if----->
<div ng-if="true condition here">
<!---select statement from above----->
<select ng-model="$parent.selectedAsset">...</select>
</div>
</div>
在这种情况下,除了有目的地绑定到父作用域之外,我还有其他选择吗?如果我有多个子作用域(嵌套的ng-if
语句),我是否需要更改ng-model
以绑定到$parent.$parent.$parent....selectedAsset
以更新控制器作用域中的值?在这个话题上有什么"最佳实践"吗?
将所有变量放入某个对象中,即:
$scope.Model = {
selectedAsset : 'mySelectedAsset1',
selectedAsset2 : 'mySelectedAsset2',
selectedAsset3 : 'mySelectedAsset3'
}
然后你可以:
<div ng-repeat> //new scope
<div ng-repeat> // new scope
<input ng-model="Model.selectedAsset">
这也降低了您对$scope的"依赖性",定义这样的Model对象将向阅读代码的每个人显示您拥有的模型。
相关文章:
- setInterval游戏循环的范围问题
- Javascript innerHTML超出范围的问题
- AngularJs避免范围界定问题
- firefox中的Javascript事件范围问题
- AngularJS指令范围约束问题重复出现
- jQuery“this”范围问题
- 可以't在quizz页面范围问题上用最终分数更新变量
- JavaScript 函数变量范围问题
- 奇怪的可变范围问题
- JavaScript 中变量范围的问题
- 主干.js(具有 Require.js)变量/范围访问问题
- 递归承诺调用 - 内存范围变量问题
- JQuery 范围滑块步进更改问题
- AngularJS中的范围问题
- 如何在 JavaScript for D3.js 中解决这样的范围问题
- 我可以设置这个吗'某事'在该服务中动态创建的嵌套对象中的服务?(可能是范围问题)
- Highcharts列范围工具提示问题
- 在函数中提示未定义返回.(问题)范围
- 访问Javascript's变量:涉及Javascript, JQuery和PHP/MySQL的问题&范围
- JavaScript 闭包问题..范围