【问题标题】:Why can't I modify the isolated scope value in my directive controller?为什么我不能修改指令控制器中的隔离范围值?
【发布时间】:2014-11-21 17:22:38
【问题描述】:

给定以下 Plunker:http://plnkr.co/edit/YicBDARAf5umI0PdCL8L?p=preview

为什么没有在指令控制器中设置 $scope.someVal?

我希望模板的输出能够显示

someVal = ABC controllerVal=DEF

但它显示

someVal = 123 controllerVal=DEF

HTML:

<html>
  <head>
    <script data-require="angular.js@1.2.25" data-semver="1.2.25" src="https://code.angularjs.org/1.2.25/angular.js"></script>
  </head>

  <body ng-app='myApp'>
    <my-test some-val="123"></my-test>

    <script>
      angular.module("myApp", [])
      .directive("myTest", function() {
        return {
          restrict: "E",
          scope: {
            someVal: "@"
          },
          template: "someVal = {{someVal}}  controllerVal={{controllerVal}}",
          controller: function($scope) {
            $scope.someVal = "ABC";
            $scope.controllerVal = "DEF";
          }
        }
      });
    </script>
  </body>
</html>

【问题讨论】:

  • 这是传递引用与 valueType 的常见问题。使用Model.someVal ...在此处查看stackoverflow.com/a/21882900/1679310(模型将作为引用传递,因此指令内部范围内更改的值将更改该引用的字段Model.someVal - 因此一切都将按预期工作)
  • 对于双向绑定,我们需要= 而不是@。见here。如果我们想让指令中所做的更改转到调用者,我们需要传递一个引用,因为 mentioned
  • plnkr.co/edit/zCSWDa?p=preview 您不需要 2 路绑定。您只需确保您的范围更新稍后运行,否则它将被一次性绑定值覆盖。
  • @PSL:复制为答案,我会接受。谢谢!
  • @Scottie 当然我会添加它并附上解释。谢谢!

标签: angularjs angularjs-directive angularjs-scope


【解决方案1】:

你没有得到更新的scope.someVal(从指令控制器完成)的原因是单向绑定值(@),因为当指令编译时,它会用来自一次绑定的插值(基本上它在创建隔离范围时在attr.someVal 上运行插值)。所以最终你会看到一个时间限制值。一种解决方法是通过使调用异步来延迟覆盖,以便在下一个摘要周期内更新它。

示例:- 将其包装在 $timeout 中或使用将其推送到异步队列

    controller: function($scope, $timeout) {

         $scope.$evalAsync(init);//Set up initialization

         $scope.controllerVal = "DEF";

         function init(){
            $scope.someVal = "ABC";
          }
      }

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多