2015-12-28 2 views
2

Я пытаюсь создать очень простой компонент в Angular 2.0, настраиваемом выпадающем меню под названием <my-select>.Двунаправленное связывание с @Input

Я прохожу model в <my-select>, который я ожидаю быть обновленным, когда конечный пользователь выбирает вариант из выпадающего списка.

Plunker: http://plnkr.co/edit/iY1hG0q9rsgrR6ltKXW4?p=preview

Как видно из Plunker, только model объект локального до <my-select> обновляется, не model объект, который я прошел в от <app>. Что мне здесь не хватает? Как одно двустороннее связывание с пользовательским компонентом?

В угловом 1.x это было так же просто, как передать переменную в $scopedirective с использованием =.

enter image description here

ответ

2

В вашей MySelect необходимо выдать

@Output() modelChange:EventEmitter = new EventEmitter(); 

а затем уведомляет родителей о измененном значении по modelChange.next(newValue);

Angular2: Passing values up from a component Смотрите также

+0

Это работает. Подробный и неинтуитивный, но он работает. Есть ли у вас какие-либо предпосылки, почему он был разработан таким образом? Угловой 1.x обрабатывается гораздо более изящно и на 90% меньше кода. – lux

+1

Это стиль React и делает двустороннюю привязку намного проще в реализации и намного более эффективную. От родительского к дочернему привязке данных распространяются изменения значений, вверх - событиями. Этот пост должен дать некоторое представление http://victorsavkin.com/post/110170125256/change-detection-in-angular-2 –

+0

Спасибо, я просто используется для 'scope: {model: '='}', который сделал все тяжелый подъем, без ввода, вывода, EventEmitters и т. д. Я прочитаю. Кажется, что преимущество - производительность, а не читаемость. – lux

2

Если вы используете объект вместо целого/примитивного для свойства входного сигнала, родитель будет видеть изменения, так как родитель и ребенок имеют один и тот же ссылку на объект. (Я предполагаю, что это несколько напоминает Угловое 1 = связывания). При таком подходе вам не нужно использовать события:

export class App { 
    model = {value: 1}; 

export class MySelect { 
    selectOption(event) { 
    this.model.value = event; 
    } 

Plunker

Я не уверен, если это рекомендованный подход (т. е. события могут быть единственным рекомендуемым методом для передачи информации родителям), но пример heavy-loader в руководствах Structural Directives использует описанную выше технику. Основной/родительский компонент имеет свойство массива logs, которое привязано к дочерним компонентам в качестве входных свойств. Детальные компоненты просто push() на этот массив, а родительский компонент отображает массив.

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