何时使用角度UI Bootstrap Modal创建新范围?

时间:2014-02-08 06:36:51

标签: angularjs twitter-bootstrap scope

我面临与问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中的作用域是不同的?在引用的问题中,答案中的注释是由于嵌套控制器,我看到在第二段代码中没有控制器的嵌套存在,而在第一段中存在。但是这并不清楚为什么在第一段代码中,视图和控制器中的范围是不同的,什么时候创建了新的范围。

1 个答案:

答案 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