2016-01-28 4 views
6

У меня есть один родительский компонент с двумя дочерними компонентами (dataset-create и dataset-detail) в Angular2. Элементы управления Родитель компонент, который из двух компонентов показан в любой момент времени с помощью этого кода в шаблоне:Угловой 2: Компоненты, удаляющиеся из DOM

<div [ngSwitch]="mode"> 
<template [ngSwitchWhen]="'create'"> 
    <dataset-create [dataset]="dataset" (close)="onDatasetFormClose()"></dataset-create> 
</template> 
<template [ngSwitchWhen]="'detail'"> 
    <dataset-detail [dataset]="dataset" (close)="onDatasetFormClose()"></dataset-detail> 
</template> 
</div> 

Родительский компонент прослушивает событие (close) от детей. Когда он получает ее, функция обратного вызова вызывается (onDatasetFormClose()), который имеет следующий код:

private onDatasetFormClose() { 
    this.mode = "list"; 
} 

Эта функция изменяет значение переменной mode. Это приводит к сбою обоих операторов ngSwitchWhen, и, следовательно, текущий активный дочерний компонент будет уничтожен.

Кроме того, FYI, это как шаблон одного из дочерних компонентов выглядит следующим образом:

<form novalidate="novalidate"> 
    <button type="button" (click)="onClose()">close</button> 
    <button type="submit" (click)="onSubmit()">submit</button> 
    <label for="dataFileD">data</label> 
    <input id="dataFileD" type="file" (change)="onFileChange($event)"> 
</form> 

Однако это решение выглядит «неправильно» для меня, потому что она опирается на родительский компонент (что делает сложнее повторно использовать его самостоятельно).

Я предполагаю, что другим способом добиться аналогичного результата будет использование маршрутизатора. Это решение не только звучит «слишком раздутым по причине», но также страдает от той же проблемы, что и мое решение выше: дочерний компонент нельзя использовать независимо.

Возможно ли, чтобы дочерний компонент удалялся из DOM? Каков правильный способ справиться с такими ситуациями? Возможно, наличие компонентов, удаляющих себя из DOM, является плохой кодировкой Angular2?

Заранее спасибо.

+1

Я думаю, что для компонента требуется материнский компонент. Любой компонент, который испускает событие, вероятно, требует родительский компонент. Например, чтобы реализовать вкладки, вам, вероятно, понадобится компонент «tabset» родителя, в дополнение к дочерним компонентам «tab». –

ответ

4

Я думаю, что для компонента требуется материнский компонент. Компонентам, которые испускают событие, обычно требуется родительский компонент. И иногда компоненты более плотно соединены или предназначены/необходимы для совместного использования. Например, для реализации вкладок нам, вероятно, необходим родительский компонент tabset, в дополнение к дочерним компонентам tab. Например, см. ng2-bootstrap tabs implmenentation.

Опора на родительский компонент (ы) также может быть сознательным дизайнерским решением. Например, если мы моделируем наше приложение с использованием неизменяемых данных приложения (см. Savkin blog), мы можем преднамеренно запретить нашему компоненту изменять любые данные приложения. Если требуется операция удаления, мы можем испустить событие, чтобы компонент более высокого уровня изменил данные приложения (а затем отправил его обратно через свойство ввода).

+0

На самом деле ваши очки имеют большой смысл. Я решил следовать этому подходу! Благодаря! – AstrOne

+0

Приятно видеть других, имеющих такой тип проблемы. Я на самом деле пытаюсь заставить ребенка отправить данные родительскому (родительский отображает данные). Сначала я использовал другую службу для хранения данных, и от этого зависели как родители, так и ребенок. Это было действительно раздражающим, то, что у вас здесь, решает эту проблему так, как я чувствую, что это должно быть сделано. – Chris

+0

@Chris, если данные, которыми вы делитесь, содержатся в массиве или объекте (то есть ссылочном типе, а не в примитивном типе (строка, число, логическое значение)), то родитель уже может видеть любые изменения, которые вы делаете для общие данные в дочернем элементе, поскольку родительский и дочерний объекты имеют одну и ту же ссылку. См. [Этот ответ] (http://stackoverflow.com/a/34208500/215945) для получения дополнительной информации. Это может упростить то, что вы пытаетесь выполнить. –

0

Почему у вас нет флага bloolean, скажите show на подкомпонент. Затем просто измените его на false, когда вам нужно. В шаблоне просто оберните все с помощью

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