我在DOM中有两个指令实例 .
<my-directive></my-directive>
......后来在dom
<my-directive</my-directive>
该指令使用一个控制器($ scope),一切都按预期工作,除非我把它放在指令中...
...
scope: {},
controller: function( $scope ){
....
当我添加隔离范围时,第一个指令不显示任何内容,第二个指令显示就好了 .
该指令调用服务来获取数据 .
这是一个工作jsFiddle与我的angularjs版本和问题 .
UPDATE #1 这是我想要工作的一个例子 . 出于某种原因,它适用于plunker,但不适用于我的本地 .
UPDATE #2
使用上面的plunker,我能够与同事一起处理这个问题 .
问题在于我在我的本地文件中所做的事情,但不是在plunker(它一直有效)中 .
这是缩短的代码
app.directive("rsGeneralLinksMenu", [ 'menuService', function( menuService ){
var shared = {};
return {
restrict: 'E',
templateUrl: 'directives/consumer-portal/menu.html',
scope: {},
controller: function( $scope ){
menuService.getTemplates( menuTemplateCallback );
shared.$scope = $scope;
} // end link
}; // end return
function menuTemplateCallback( template ){
shared.$scope.links = template;
}
}]);
我在这里学到了什么......
Angularjs遍历指令并返回返回对象(以及返回对象中的任何内容) .
如您所见,我正在设置var shared = {};在返回之外,以便我以后可以附加$ scope控制器并在return语句之外使用$ scope而不必在参数中传递它 . 然而,这有一个我当时没有意识到的副作用 .
当指令加载时,它会创建'shared'对象并将$ scope附加到它,这是我从调用shared . $ scope.links中绘制返回的服务器数据的地方,从而更新HTML模板 .
如果你还记得,我在DOM中有两个这个指令的实例 . 创建第二个实例时,它覆盖了第一个指令的共享 . $ scope对象,其指令号为$ scope,因此删除了第一个指令的$ scope的任何引用 .
通过删除'shared'对象并将回调嵌套在指令控制器内部,回调引用了每个实例的正确$ scope对象,现在一切正常 .
它现在像这样......
app.directive("rsGeneralLinksMenu", [ 'menuService', function( menuService ){
return {
restrict: 'E',
templateUrl: 'directives/consumer-portal/menu.html',
scope: {},
controller: function( $scope ){
menuService.getTemplates( menuTemplateCallback );
function menuTemplateCallback( template ){
$scope.links = template;
}
} // end link
}; // end return
}]);
上面的plunker链接现在有一个完整的工作示例 . 我的两个指令只需要一个服务器数据返回来使用相同的数据,但是我在plunker中稍微分解了一下,以显示指令的两个实例如何包含它们自己的范围对象 .
Wow, that was fun learning that!!!!