隔离范围无法按我认为的方式工作

问题描述 投票:1回答:1

我对隔离范围有一个基本的误解,我不知道是什么。

我有一个控制器和指令:

.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"/>

[当我运行此应用程序时,将为z显示'yabba'的值。我很好隔离范围使这成为可能。但是,模板直接进入$scope,并且能够运行函数并获取标量(zedzz)。我不要控制器需要访问$scope,因为我最终将要使用的模型必须由$ scope数据组装而成。

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

我希望$scope对控制器可用,但对指令不可用。我希望指令必须专门从控制器获取其数据。我试图将zzed添加到隔离范围,但这没有帮助。

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

javascript angularjs-directive angularjs-scope angularjs-controller
1个回答
0
投票

您正在通过将控制器包括在指令中来踩踏脚趾。只需从指令中删除此行,它就会像您猜测的那样运行:controller:“ MyCtrl”,

这里是一个混蛋。您可以看到您的隔离范围正在正常工作,并且注释了该行。只需取消注释该行,然后查看您现在如何访问控制器作用域即可。

.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发布时可能不是这种情况。在您的示例中,指令中不需要控制器。我很少包括控制器,并且我总是将范围隔离。祝好运!希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.