隔离范围不像我认为的那样工作

时间:2015-01-09 17:04:05

标签: angularjs-directive angularjs-scope angularjs-controller

我对隔离范围有一个基本的误解,我无法弄清楚它是什么。

我有一个控制器和指令:

.controller('MyCtrl', [
    '$scope',
    function($scope) {
        $scope.zed = "ZZZZZ";
        $scope.zz = function() {
            return "yep";
        };
    }])
.directive("myDirective", function() {
    return {
        restrict: "AE",
        controller: "MyCtrl",
        templateUrl: 'a/path/to/my_template.html',
        scope: {
            z: '@'
        }
    };

和模板:

<div>***{{z}} {{zz()}} ^^^ {{zed}} </div>

以及指令的使用:

<div my-directive z="yabba"/>

当我运行此应用时,&#39; yabba&#39;显示z。我很擅长。隔离范围使这成为可能。但是,模板会直接进入$scope并能够运行一个函数并获取一个标量(zedzz)。我不想要那个。控制器需要访问$scope,因为我最终操作的模型必须从$ scope数据中组装。

我希望将指令限制为尽可能少的信息。

我希望$scope可供控制器使用,但不能使用指令。我希望指令必须独占控制器的数据。我尝试将zzed添加到隔离范围,但这没有任何帮助。

我该怎么做?或者,我的方法对Angular来说简直是陌生的吗?如果是这样,那很酷,请向我解释一下更好的方法。并且,请使用小词。

1 个答案:

答案 0 :(得分:0)

通过将控制器包含在指令中,您正在踩着脚趾。只需从你的指令中删除这一行,它就像你猜到的那样:控制器:&#34; MyCtrl&#34;,

这是一个乱搞的傻瓜。您可以通过注释掉的行看到您的隔离范围正常工作。只需再次注释该行,看看您现在如何访问控制器范围。

.directive("myDirective", function() {
return {
    restrict: "AE",
    // controller: "MyCtrl", REMOVE THIS LINE!!!
    templateUrl: 'a/path/to/my_template.html',
    scope: {
        z: '@'
    }
};

Plunker playground with your code

顺便说一下,你的代码中没有任何异类。隔离范围是与自定义指令一起使用的一个很好的功能。有很多方法可以使用Angularjs 1. +。当Angularjs 2.0发布时,情况可能并非如此。在您的示例中,指令中不需要控制器。我很少包含控制器,而且我总是隔离范围。祝好运!希望这会有所帮助。