2016-02-14 1 views
4

Я хотел расширить приложение из [Учебника Angular2 в] [1], имея внучонок компонент, питания выберите, вызываемый из HeroDetailComponent:Angular2 Обнаружение изменения - объект против ввода строки собственности

selector: 'my-hero-detail', 
    template: ` 
    <div *ngIf="hero"> 
     <h2>{{hero.name}} details!</h2> 
     <div><label>id: </label>{{hero.id}}</div> 
     <div> 
     <label>name: </label> 
     <input [(ngModel)]="hero.name" placeholder="name"/> 
     <power-select [(power)]="hero.power"></power-select> 
     </div> 
    </div> 
    `, 
    directives: [PowerSelectComponent], 
    inputs: ['hero'] 

Когда я передаю в hero.power как объект, изменения отражаются на родителях/бабушке и дедушке.

http://plnkr.co/edit/UfMStWU5fEywvovpSIg1?p=preview

Однако, если я пытаюсь передать hero.power как строка изменения не будут отражаться, если я не использовать EventEmitter @Ouput.

http://plnkr.co/edit/p9YcfGudIgSbGPp1xrlw?p=preview (предоставляется: zoechi)

Спрашивается, зачем мне нужен EventEmitter @output, когда я передать строку, а не когда я передать объект?

ответ

5

Разница заключается в том, что свойства объекта изменяемы, а строка не является (как и все другие примитивные типы, логические, число, символ, нуль и неопределенные https://developer.mozilla.org/de/docs/Web/JavaScript/Datenstrukturen).

Объект получает пропуски в качестве ссылки, поэтому ваш дед, родитель, ребенок (если вы его передадите) имеют ссылку на тот же объект, в то время как строка передается как копия.
Если вы передаете строку вокруг каждого, вы получаете копию, которая вообще не связана с источником (за исключением того, что она имеет такое же значение).

Вы можете утверждать, что свойство объекта также является строкой. Если свойство перемешивания объекта изменяется, в качестве значения устанавливается другая строка, но поскольку ничто не ссылается на строку напрямую, а скорее через ссылку на объект, когда они обращаются к строковому свойству, они получают новое значение.

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