我正在尝试通过范围变量传递模板的url。范围不会改变,因此模板不需要根据它进行更新,但目前范围变量始终未定义。
<div cell-item template="{{col.CellTemplate}}"></div>
理想情况下,指令是:
.directive("cellItem", ["$compile", '$http', '$templateCache', '$parse', function ($compile, $http, $templateCache, $parse) {
return {
scope: {
template: '@template'
},
templateUrl: template // or {{template}} - either way
};
}])
然而,这不起作用。我在完成相同的概念时尝试了很多不同的排列,这似乎是最接近的,但它仍然不起作用。
.directive("cellItem", ["$compile", '$http', '$templateCache', '$parse', function ($compile, $http, $templateCache, $parse) {
return {
scope: {
template: '@template'
},
link: function (scope, element, attrs) {
var templateUrl = $parse(attrs.template)(scope);
$http.get(templateUrl, { cache: $templateCache }).success(function (tplContent) {
element.replaceWith($compile(tplContent)(scope));
});
}
};
}])
我也尝试过使用ng-include,但在编译之前也没有评估范围变量。 CellTemplate值来自数据库调用,因此在评估之前完全未知。任何有关此工作的建议都将非常感谢!
编辑: 我正在使用angular 1.0.8并且无法升级到更新的版本。
答案 0 :(得分:14)
你根本不远。
您不需要为指令使用隔离范围。您可以像这样传递templateUrl:
<div cell-item template="col.CellTemplate"></div>
然后添加一个监视以检测模板值何时更改:
.directive("cellItem", ["$compile", '$http', '$templateCache', '$parse', function ($compile, $http, $templateCache, $parse) {
return {
restrict: 'A',
link: function(scope , element, attrs) {
scope.$watch(attrs.template, function (value) {
if (value) {
loadTemplate(value);
}
});
function loadTemplate(template) {
$http.get(template, { cache: $templateCache })
.success(function(templateContent) {
element.replaceWith($compile(templateContent)(scope));
});
}
}
}
}]);
这是一个有效的Plunker:http://plnkr.co/edit/n20Sxq?p=preview
答案 1 :(得分:6)
如果您不想自己处理链接逻辑,或者您想要隔离范围,我认为这更简单:
.directive("cellItem", ["$compile", '$http', '$templateCache', '$parse', function ($compile, $http, $templateCache, $parse) {
return {
scope: {
template: '@template'
},
template: "<div ng-include='template'></div>"
};
}])
或:
template:"<ng-include src='template'></ng-include>"
答案 2 :(得分:1)
这是一个古老的帖子,但我认为如果有人在这里找到答案,它会很有用。
您可以尝试将templateUrl函数用作评论中提到的@caub。同样也可以用于组件。
i>0
我们不需要任何注入的依赖项。希望这有助于某人。