我对隔离范围有一个基本的误解,我不知道是什么。
我有一个控制器和指令:
.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
,并且能够运行函数并获取标量(zed
和zz
)。我不要控制器需要访问$scope
,因为我最终将要使用的模型必须由$ scope数据组装而成。
我希望将指令限制为尽可能少的信息。
我希望$scope
对控制器可用,但对指令不可用。我希望指令必须专门从控制器获取其数据。我试图将z
和zed
添加到隔离范围,但这没有帮助。
我该怎么做?或者,我的方法对Angular而言是简单的陌生方法吗?如果是这样,那很酷,请向我解释更好的方法。并且,请使用小词。
您正在通过将控制器包括在指令中来踩踏脚趾。只需从指令中删除此行,它就会像您猜测的那样运行: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发布时可能不是这种情况。在您的示例中,指令中不需要控制器。我很少包括控制器,并且我总是将范围隔离。祝好运!希望这会有所帮助。