我对隔离范围有一个基本的误解,我无法弄清楚它是什么。
我有一个控制器和指令:
.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
并能够运行一个函数并获取一个标量(zed
和zz
)。我不想要那个。控制器需要访问$scope
,因为我最终操作的模型必须从$ scope数据中组装。
我希望将指令限制为尽可能少的信息。
我希望$scope
可供控制器使用,但不能使用指令。我希望指令必须独占控制器的数据。我尝试将z
和zed
添加到隔离范围,但这没有任何帮助。
我该怎么做?或者,我的方法对Angular来说简直是陌生的吗?如果是这样,那很酷,请向我解释一下更好的方法。并且,请使用小词。
答案 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发布时,情况可能并非如此。在您的示例中,指令中不需要控制器。我很少包含控制器,而且我总是隔离范围。祝好运!希望这会有所帮助。