我面临与问here相同的问题,解决方案也有效。但是当创建范围时,无法绕过我的脑袋。如果在下面的代码中在$ modal指令上创建了新范围,那么为什么modal.html(view)和ModalInstanceCtrl中的范围不同?
在同一问题的下面一段代码中:
$scope.open = function () {
var modalInstance = $modal.open({
templateUrl: 'modal.html',
controller: 'ModalInstanceCtrl'
});
(主要问题在modal.html中,ng-model =" text"与其控制器中的$ scope不在同一范围对象中:ModalInstanceCtrl。)
我对范围的理解是,rootcope首先由ng-app创建。然后,新的作用域由创建新作用域的指令创建。
主要的不一样是在路由中,结构类似于上面的代码:
$routeProvider
.when('/', {
redirectTo: '/pages'
})
.when('/food', {
templateUrl: 'food.html',
controller: 'foodController'
})
.when('/play', {
templateUrl: 'play.html',
controller: 'playController'
});
尽管有相似之处,但这里的templateUrl(view)和controller中的scope对象是相同的,那么为什么在fisrt代码中templateUrl(view)和controller中的作用域是不同的?在引用的问题中,答案中的注释是由于嵌套控制器,我看到在第二段代码中没有控制器的嵌套存在,而在第一段中存在。但是这并不清楚为什么在第一段代码中,视图和控制器中的范围是不同的,什么时候创建了新的范围。
答案 0 :(得分:3)
在编写角度应用程序时重新启动WTF。当这种情况发生在我身上时,我感觉到某个地方有一个“隐藏”的范围,我可能忘记了“在ng模型中更喜欢点符号”规则。
在这种情况下,请查看html源代码。您的modal.html内容位于<div class="modal-content" ng-transclude>
内。这绑定到一个新的transcluded范围,该范围继承自ModalInstanceCtrl的范围。
当您键入输入时,会将新的文本属性添加到已转换的范围,因为直接在范围上分配基元不会查询原型链。不参考ModalInstanceCtrl的范围。
将基元分配给作用域上的对象确实参考了原型链,因此使用了点符号规则。这就是为什么您引用的SO文章适用于input.abc
这是great SO article on prototypical inheritance and angular scopes