2016-06-18 4 views
10

Могу ли я использовать несколько шаблонов в компонентах AngularJS 1.5? У меня есть один компонент, имеющий один атрибут, поэтому я хочу загрузить другой шаблон на основе этого имени атрибута. Как добиться загрузки шаблонов на основе имени атрибута элемента?Более одного шаблона в одном компоненте в AngularJS 1.5

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") 
    }  
} 
}) 

Спасибо.

ответ

6

Я использую два способа для создания динамического шаблона компонента в 1.5.x:

1) Пропустите через атр собственности:

templateUrl: function($element, $attrs) { 
     return $attrs.template; 
} 

2) Подайте услуги в шаблон и получить шаблон оттуда:

функция templateURL:

templateUrl: function($element, $attrs,TemplateService) { 
     console.log('get template from service:' + TemplateService.getTemplate()); 
     return TemplateService.getTemplate(); 
} 

В GetTemplate функция обратного шаблона URL на основе переменной

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 переменной «Вид» на заводе во-первых, с помощью метода набора.

Если вам нужно больше изменений в шаблоне html, вернитесь к использованию директивы и используйте службу компиляции с большей поддержкой.

+0

совершен, благодаря – wmnitin

+0

я использовал этот ответ, в отличие от более высокого голосовавшего ответа. Использование метода службы в этом ответе позволяет избежать шаблонов жесткого кодирования. См. Примечание к интерполяции @DicBrus ниже. –

16

Что касается передачи шаблона в качестве параметра для компонента? Например создать компонент как:

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]; 
    } 
}); 

И, используя компонент, как показано ниже, может помочь

<test-component template='first'></test-component> 
+0

Это такое элегантное решение. Это должен быть принятый ответ. Спасибо! – hkong

+2

это работает, только если вы используете «жестко закодированное» значение шаблона = атрибут внутри тега . Поскольку вам нужно что-то вроде Это решение не работает из-за неинтерполированного значения – DicBrus

Смежные вопросы