为什么不能从ui-bootstrap模态控制器中绑定$scope字符串值?

Why won't binding to a $scope string value from a ui-bootstrap modal controller work?

本文关键字:scope 字符串 绑定 不能 ui-bootstrap 模态 控制器 为什么      更新时间:2023-09-26

我使用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}}。我在这里完全遗漏了什么?

这是因为bootstrap创建了一个子作用域(@ var modalScope = (modalOptions.scope || $rootScope).$new();),提供了作用域参数。所以在angular子作用域中,原型继承自父级。原始类型(当绑定中没有.时)不会在原型链中进行咨询,并且会添加一个新的属性val并更新它,这不会反映在底层作用域中,只有更新引用类型(对象,函数引用等)才会反映更改,因此obj.val工作,因为父作用域也引用了相同的obj

所以当你这样做的时候:-

 $scope.val = "";

在提供的作用域之外创建的新子作用域将在子作用域更新val,因为它不是作为引用类型的值更新的,所以你不会看到它在父作用域更新。

这里有一个很好的阅读