2017-02-01 3 views
0

У меня есть массив элементов, и каждый элемент массива имеет одну ссылку Удалить, клик которой я хочу, чтобы выбранный элемент массива был удален. Я толкаю объекты в массив уже и могу получить данные.Угловой 2 удаление выбранного элемента массива в дочернем компоненте

Код, который я использую, указан ниже.

Детский Component-

@Component({ 
    selector: 'child', 
    template: ` 
    <div> 
     {{element.name}} 
     <span (click)="deleteElement()">Delete</span> 
    </div> 
    ` 
}) 
export class ChildComponent { 
    @Input() 
    element: any; 
    @Output() 
    elementDeleted: EventEmitter<any> = new EventEmitter(); 

    deleteElement() { 
    this.elementDeleted.emit(); 
    } 
} 

Мой Родитель Component-

@Component({ 
    selector: 'child', 
    template: ` 
    <div> 
     <child *ngFor="let element of elements; let i= index;" [element]="element" (elementDeleted)="onElementDeleted(element)"> 
     </child> 
    </div> 
    ` 
}) 
export class ParentComponent { 
    constructor() { 
    this.elements = [ 
     { name: 'element1' }, 
     { name: 'element2' }, 
     (...) 
    ]; 
    } 

    onElementDeleted(element) { 
    var index = this.elements.findIndex((elt) => (elt===element)); 
    if (index != -1) { 
     this.elements.splice(index, 1); 
    } 
    } 

Прямо сейчас, каждый раз, когда последний элемент массива становится удален, вместо того, чтобы удалить выбранный item.For отл. Если я нажимаю ссылку Удалить для 0-го или 1-го индекса, все же последний элемент удаляется. Я не уверен, где я ошибаюсь.

ответ

0

EDIT: хорошо, вы также можете сделать это следующим образом:

Вам нужно пройти, какой элемент должен быть удален, так что правый элемент будет удален. Поэтому немного измените свой код, а затем пропустите элемент в вашем удалении.

<div> 
    {{element.name}} 
    <span (click)="deleteElement(element)">Delete</span> 
</div> 

и сделать Испустите передать элемент должен быть удален:

deleteElement(element) { 
    this.elementDeleted.emit(element); 
} 

, а затем удалить элемент:

onElementDeleted(element) { 
    let index = this.elements.indexOf(element); 
    this.elements.splice(index, 1); 
} 

И как уже говорилось Даниилом, # устарела, используйте let вместо.

+0

Я тоже смотрел на это, и могу сказать, что поток правильный и работает таким образом: '(click) =" deleteElement() "' -> 'this.elementDeleted.emit()' -> '(elementDeleted) =" onElementDeleted (element) "', так что это определенно не эта проблема. –

+0

Yaah, я просто не упомянул '#' в своем ответе: D Я даже не думал о том, чтобы делать это иначе, чем это, ну, теперь есть два варианта. Не думал, что # и пусть будет иметь значение, и что # все равно будет поддерживаться, по-видимому, не :) – Alex

+0

Было, вероятно, слишком много проблем (например, этот вверх) с шаблоном с глобальным охватом '#', используемым в '* ngFor 'и он был удален, используя его теперь выдает ошибку. –

1

Обновите свою версию Angular2. Проблема здесь, вероятно, в удаленном синтаксисе *ngFor=#element of elements, где #element меняется после присвоений, поэтому вы получаете последний элемент из списка в каждом случае (глобальная область шаблонов). Новый синтаксис - *ngFor="let element of elements", и он отлично работает. Plunker: https://plnkr.co/edit/OsxUS3V5pB3Tqko5SojJ?p=preview

+1

+1 Ваш ответ, безусловно, больше говорит о том, когда дело доходит до вопроса, но я полагаю, что оставлю свой ответ здесь только для другой перспективы, если не что-то еще: P – Alex

+0

изменен #, чтобы все еще сталкиваться с той же проблемой. –

+0

Какую версию A2 вы используете? –