【问题标题】:Accessing parent Controllers scope within a directive that uses ControllerAs and scope:true在使用 ControllerAs 和 scope:true 的指令中访问父控制器范围
【发布时间】:2015-06-08 16:05:37
【问题描述】:

我正在尝试在没有 $scope 注入的指令中使用 ControllerAs,而是使用它,而当 scope:true 时我正在苦苦挣扎

当我使用隔离作用域时,一切正常,因为我可以使用 bindToController: true,但在这种情况下,我遗漏了一些东西,我不知道是什么。

我有这个代码。如您所见,我试图在我的指令中打印 foo3(来自 MyController)和 foo4(来自 MyDirectiveController)。这可以很容易地在两个控制器中使用 $scope 注入来完成,但是当我尝试使用它时,我不知道我是否可以(以及如何)在我的指令中从 MyController 访问 foo3。

angular
    .module("app",[])
    .controller('MyController', MyController)
    .controller('MyDirectiveController', MyController)
    .directive('myDirective', myDirective);

function MyController() {
    var vm = this;
    vm.foo3 = 'foo3';
}

function myDirective() {
    return {
        restrict: 'E',
        scope: true,
        controller: MyDirectiveController,
        controllerAs: 'vm',
        template: '{{vm.foo3}} - {{vm.foo4}}'
    }
}

function MyDirectiveController() {
    var vm = this;
    vm.foo4 = 'foo4'; 
}

这里是jsfiddle

【问题讨论】:

  • 你说不行,什么意思?
  • 如果我在模板中使用 {{vm.foo2}} 而不是 {{vm.foo}} 它不会打印任何内容。如果我使用 $scope 没问题,因为指令中的范围继承自 MyController 中的范围,但是当使用 this(在本例中为 vm)时,我不知道如何实现。
  • 看看这个小提琴 - jsfiddle.net/9yhgjk4g/3,我觉得它没问题。
  • 当然,因为您在这两种情况下都使用 foo。我想使用来自 MyController 的 foo,而不是来自指令控制器的 foo2。
  • 啊,搞定你了..我的错!!

标签: angularjs angularjs-directive angularjs-scope


【解决方案1】:

像这样实例化 MyController 时,只需使用 controllerAs 语法。

<!-- Notice the "as vmMy" syntax : Now everything can be accessed via "vmMy." -->

<div ng-controller="MyController as vmMy"> 
    <my-directive></my-directive> 
</div>

现在,无论何时您使用 vmMy. 符号,它都会访问 MyController 范围内的内容!

所以你的模板现在可以是这样的:

template: 'From MyController: {{vmMy.foo}}<br> From MyDirective: {{vm.foo2}}'  

jsFiddle update

【讨论】:

  • 好的,但这是唯一的方法吗?我的意思是,如果我想对不同的控制器使用相同的指令,而不仅仅是 MyController,该怎么办?当我使用 $scope 时,我不需要这样做。
  • 您可以通过属性将内容传递到指令中,例如&lt;my-directive something="vmMy.foo" /&gt;,其中 vmMy.foo 在其他情况下可能完全不同,您可以传递一些其他外部控制器内容。然后您将访问指令scope : { something : '@' } 对象中的项目。 @ 表示某事是一个属性。
  • 有很多不同的方式,但是例如在模板中使用属性方式,它只需与{{ vm.something }} 一起使用,因为它成为您指令中vm 的一部分。所以它不在乎你传入什么
  • 好的,我刚刚意识到您实际上是用您的第一个答案回答了我的问题。诀窍是您对控制器 vm 和 vmMy 使用了不同的值,而我使用的是相同的值,但它不起作用。非常感谢。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多