0

我正在使用 ui-bootstrap 来处理我的模态。我将 $scope 作为范围参数传入,它看起来像这样:

var modalInstance = $modal.open({
    templateUrl: 'views/pages/gethelp/modals/bulk_change.html',
    controller: BulkChangeCtrl,
    size: 'lg',
    scope: $scope,
    backdrop:"static",
    resolve: {
      type: function() { return type; },
      field:function() { return field; },
      preset: function() { return preset; }
    }
  });

在我的模态控制器中,我定义了一个模型字符串值,我想将它绑定到输入,并在用户点击提交时用作选定值。这很简单,设置如下:

$scope.val = "";

然而,在我通过按钮单击调用的提交函数中,无论如何,$scope.val 都是空的。这就像函数引用了一个完全不同的 $scope.val 版本。然而在我看来,我可以绑定到 {{val}} 没问题。

为什么是这样?当我将代码更新为:

$scope.obj = { val:"" };

这一切都按预期工作,我可以绑定到 {{obj.val}}。我在这里完全错过了什么?

4

1 回答 1

3

这是因为引导程序var modalScope = (modalOptions.scope || $rootScope).$new();使用范围参数创建了提供范围的子范围 (@)。因此,在角度子范围内,原型从父级继承。并且原始类型(当.绑定中没有)不会在原型链中被查询,并且会添加一个新属性val并更新它,这不会反映在底层范围中,只会更新引用类型(对象,函数参考等..) 反映了更改,因此obj.val可以工作,因为父范围也具有相同的参考obj

所以当你这样做时: -

 $scope.val = "";

在提供的范围之外创建的新子范围将val在子范围内更新,因为它没有作为引用类型上的值更新,您不会看到它在其父范围内更新。

这是一个很好的阅读

于 2014-08-12T18:20:30.497 回答