【发布时间】:2013-02-20 02:55:14
【问题描述】:
我发现这个线程,其中 OP 的 original fiddle ng-included 范围没有修改其父范围。
其中一个回复建议:
它丑陋且不可预测,因此我建议您将数据包装在对象变量中:http://jsfiddle.net/e5rfP/3/
这似乎有效。这是为什么呢?
【问题讨论】:
-
优秀的答案,马克。
我发现这个线程,其中 OP 的 original fiddle ng-included 范围没有修改其父范围。
其中一个回复建议:
它丑陋且不可预测,因此我建议您将数据包装在对象变量中:http://jsfiddle.net/e5rfP/3/
这似乎有效。这是为什么呢?
【问题讨论】:
对象变量之所以起作用,是因为 JavaScript 原型继承的工作方式。 ngInclude 创建自己的子范围。这个子作用域原型继承自父作用域。
在 JavaScript 中,当我们在子作用域中编写 $scope.x = 22 之类的东西时,这会在子作用域上创建一个 x 属性并为其分配值 22 —— 这里不参考原型链,因此父作用域$scope 看不到发生了什么。
当我们在子作用域上写$scope.someObj.prop1 = 22之类的东西时,如果JavaScript在子$scope上没有找到someObj对象,它会查询原型链,链中的下一个$scope就是父作用域$范围。如果父 $scope 上存在someObj,则修改父 $scope。
正如我在评论中提到的,以下 SO 问题和答案更详细地解释了这一切(有很多图片):What are the nuances of scope prototypal / prototypical inheritance in AngularJS?
【讨论】:
此指令将包含一个部分而不创建新范围。例如,您可以在部分中创建一个表单并从父控制器控制该表单。
这是我为它创建的link to the Repo。
我的回答基于this S.O. answer 祝你好运:-)
【讨论】: