问题
Can I use more than one template in AngularJS 1.5 components ? I have one component having one attribute, so I want to load different template based on that attribute name. How can I achieve loading of templates based on attribute name of element?
jsConfigApp.component('show', {
templateUrl: 'component/show.html', //How to change it based on attribute value?
bindings:{
view:"@"
},
controller: function () {
console.log(this.view)
if (this.view = "user") {
console.log("user")
} else if (this.view = "user") {
console.log("shop")
} else {
console.log("none")
}
}
})
Thanks.
回答1:
I use two ways for making dynamic template of a component in 1.5.x:
1) Pass via attr property:
templateUrl: function($element, $attrs) {
return $attrs.template;
}
2) Inject a service into template and get template from there:
templateURL function:
templateUrl: function($element, $attrs,TemplateService) {
console.log('get template from service:' + TemplateService.getTemplate());
return TemplateService.getTemplate();
}
In getTemplate function return template url based on variable
getTemplate: function(){
if (this.view = "user") {
return "user.html";
} else if (this.view = "user") {
return "shop.html";
} else {
console.log("none")
}
return "shop.html";
}
Pass variable 'view' to factory firstly via a set method.
If you need more change in html template, back to use directive and use compile service with more support.
回答2:
What about passing template as an parameter to component? For example create a component like:
module.component('testComponent', {
controllerAs: 'vm',
controller: Controller,
bindings: {
template : '@'
},
templateUrl: function($element, $attrs) {
var templates = {
'first' :'components/first-template.html',
'second':'components/second-template.html',
'third' :'components/third-template.html'
}
return templates[$attrs.template];
}
});
And using component as below may help
<test-component template='first'></test-component>
来源:https://stackoverflow.com/questions/37902174/more-than-one-template-in-same-component-in-angularjs-1-5