javascript - 为什么从 ui-bootstrap 模式 Controller 绑定(bind)到 $scope 字符串值不起作用?

标签 javascript angularjs twitter-bootstrap angular-bootstrap

我正在使用 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; }
    }
  });

在我的模态 Controller 中,我定义了一个模型字符串值,我希望将其绑定(bind)到输入并在用户点击提交时用作所选值。这很简单,设置如下:

$scope.val = "";

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

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

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

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

最佳答案

这是因为 bootstrap 使用范围参数创建了提供范围的子范围 (@var modalScope = (modalOptions.scope || $rootScope).$new();)。因此,在 Angular 子作用域中,原型(prototype)继承自父作用域。原始类型(当绑定(bind)中没有 . 时)将不会在原型(prototype)链中被查询,并且将添加一个新属性 val 并更新它,这不会被反射(reflect)在底层作用域中,只有对引用类型(对象、函数引用等)的更新才会反射(reflect)更改,因此 obj.val 可以工作,因为父作用域也引用相同的 >obj.

所以当你这样做时:-

 $scope.val = "";

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

这是一个good read

关于javascript - 为什么从 ui-bootstrap 模式 Controller 绑定(bind)到 $scope 字符串值不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25271351/

相关文章:

javascript - Jquery 元素仅在页面刷新后有效

javascript - jQuery 拖放上传...在哪里可以找到?

javascript - 页面是否符合标准很重要,即使它工作正常?

javascript - 替换数据属性html

angularjs - Angular JS Touch Slider 与 Ionic 框架一起使用时显示 NaN 错误

javascript - 背景图像不透明度

javascript - 如何在 JavaScript 中按下数组中的按钮来相应地更改内容?

javascript - 单选按钮图像在 Internet Explorer Edge 中无法正常工作

javascript - $state 的 subview 未在命名的 ui-view 中呈现

html - 优化文本渲染 - CSS