Angular 2 компонента с несколькими видами

Как я могу предоставить Angular 2 компонентные множественные представления\просматривать шаблоны?

Нужно ли использовать ng-контент? Это не совсем то, что я хочу. Может быть, свойство компонента, которое указывает URL-адрес шаблона, но затем, как изменить вид \template в классе компонента?

Ответы

Ответ 1

Сегодня также подумайте об этой проблеме. Я "изобретаю" это решение http://plnkr.co/edit/FYVwbBwSnqWRcvAVz3wh?p=preview. Может быть, это поможет вам в будущем.

export class MyModel {
  lala;
  constructor() {
    this.lala = "llaala";
  }
  appendToLala(param: string){
    this.lala += param;
  } 
}

@Component({
  selector: 'c1',
  template: `<div><h2>Hello {{lala}}</h2></div>`,
})
export class Component1 extends MyModel {
  constructor(){
    super();
    this.appendToLala(" bebebe");
  }
}


@Component({
  selector: 'c2',
  template: `<div><h2>Hello {{lala}}</h2></div>`,
})
export class Component2 extends MyModel {
  constructor(){
    super();
    this.appendToLala(" nenene");
  }
}

Идея состоит в том, чтобы создать абстрактную модель компонента и использовать ее как родитель @Component. И при необходимости вы можете создать дерево из моделей, а класс @Component всегда будет листом в этом дереве.

Ответ 2

Содержимое ng должно использоваться для определения того, куда вы хотите, чтобы содержимое вашего компонента было отправлено, объяснение следует:

Скажите, что вы определяете свой собственный компонент с его шаблоном и селектором "my-cmp", если вы используете его как таковой: <my-cmp><div>content</div></my-cmp>, div внутри вашего компонента должен куда-то идти, это то, что вы определяете в шаблоне, когда вы реализуете my-cmp. Скажем: <h1>my component title</h1><ng-content></ng-content> ваш div пойдет туда, где будет размещено содержимое ng.

Теперь, если вы хотите иметь несколько представлений, я считаю, что это проблема дизайна, и это, скорее всего, два разных компонента, а затем родительский контейнер будет содержать их обоих. Этот родительский контейнер может связываться с вашим сервисом и предоставлять вашим дочерним компонентам модель, которая им нужна для отображения. Они могут генерировать событие, когда пользователь что-то делает, что родительский ловит, запускает вызов службы и передает им обновленную модель посредством привязки данных.

Или, если вы хотите отображать один или другой, возможно, его можно обрабатывать с помощью маршрутов?

Или последним способом будет ng-if, если у вас есть определенное состояние в вашей модели, тогда отобразите один дочерний компонент, иначе отобразите другой.

Если вы немного более конкретно о том, что у вас есть, я мог бы составить несколько кода.

Ответ 3

Вот как я справился с этим, хотя мне не нравится решение:

  • У меня есть компонент myComponent, который отображает selector: 'my-component'.
  • В моем основном приложении я создаю две переменные target:string = 'template-one' и target2:string = 'template-two'.
  • Я создаю два экземпляра компонента в моем шаблоне приложения, который выглядит как <my-component [target]="target"></my-component> и <my-component [target]="target2"></my-component>.
  • Наконец, в шаблоне для my-component у меня есть два разных блока разметки, первый предназначенный для target === "template-one", а второй для target === "template-two". На внешнем элементе html для одного я помещаю *ngIf="target === 'template-one'", а на внешний элемент html для другого я помещаю *ngIf="target === 'template-two'", который эффективно создает fork в рендеринге.

Я могу отправить сообщение, если я придумаю что-то лучшее, но пока это лучшее, что я мог бы сделать с тем, что мне дал Angular 2.

Ответ 4

Не уверен, что NG2 имеет встроенный способ поддержки этого.

Похоже, вам нужны два компонента, но у вас есть один, и вы привязываетесь, чтобы найти быстрый способ. Но лучшим решением будет разделение сложной логики на разные структуры (например, сервисы, другие модули и т.д.). Лучше всего это сделать структуру, с которой будет удобно работать. И когда вы создадите эту структуру - вам не нужно будет указывать несколько html в директиве.

Ответ 5

Если вы просто пытаетесь изменить то, что отображается в представлении для одного пользовательского сеанса, на основе значения переменной в вашем компоненте, вы можете рассмотреть возможность размещения вашего html в различных элементах div и использовать ngIf или ngSwitch для переключения между ними.

Быстрый и дешевый пример, если в вашем компоненте есть логическая переменная с именем "loading", вы можете переключаться между тем, что отображается следующим образом:

<div *ngIf="loading">
    <h1>Loading...</h1>
</div>

<div *ngIf="!loading">
...
</div>