我的模块中有一个指令。我想根据属性更改templateUrl
。
HTML
<div test stage="dynamicstage"></div>
模块
angular.module('trial', [])
.controller('trialCtrl', function ($scope) {
$scope.dynamicstage = 'Welcome';
})
.directive('test', function () {
return {
restrict: 'A',
scope: {
'stage': '='
},
link: function (scope, element, attrs) {
scope.$watch('stage', function(condition){
if(stage === 'welcome'){
templateUrl: "hello.html";
}else{
different template url...
};
});
}
}
});
这不起作用。 templateurl
未加载到div中。我想动态更改templateUrl是可能的。
我感谢任何帮助。
答案 0 :(得分:1)
这在Angular中不是很透明。 templateUrl
可以是动态构建模板URL的函数,但是在您的情况下,您需要一个范围,目前尚未提供URL。
您可以在ngInclude
:
app.directive('test', function() {
return {
restrict: 'A',
scope: {
'stage': '='
},
template: '<div ng-include="templateUrl"></div>',
link: function(scope, element, attrs) {
scope.$watch('stage', function(condition) {
if (scope.stage === 'Welcome') {
scope.templateUrl = "hello.html";
} else {
scope.templateUrl = "other.html";
};
});
}
}
});
答案 1 :(得分:1)
解决方案1:
scope.$watch('stage', function(condition){
var templateUrl;
if(stage === 'welcome'){
templateUrl = "hello.html";
} else{
templateUrl = "someothertemplate.html";
};
//load the template;
$http.get(templateUrl)
.then(function (response) {
// template is loaded.
// add it and compile it.
angular.element(element).html(response.data);
$compile(element.contents())(scope);
});
});
<强>溶液2:强> 使用ng-include
<div test stage="dynamicstage">
<div ng-include="templateUrl"></div>
</div>
内部指令:
scope.$watch('stage', function(condition){
var templateUrl;
if(stage === 'welcome'){
templateUrl = "hello.html";
} else{
templateUrl = "someothertemplate.html";
};
scope.$parent.templateUrl = templateUrl; // make sure that templateUrl is updated in proper scope
})