Angular2 变化检测 - 对象与字符串输入属性

标签 angular

我想通过从 HeroDetailComponent 调用一个孙子组件 power-select 来扩展 [Angular2 的教程][1] 中的应用程序:

  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 作为对象传入时,更改会反射(reflect)到父/祖 parent 。

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

但是,如果我尝试将 hero.power 作为字符串传递,除非我使用 @Ouput 事件发射器,否则更改不会得到反射(reflect)。

http://plnkr.co/edit/p9YcfGudIgSbGPp1xrlw?p=preview (提供:zoechi)

问题是,为什么我在传递字符串而不是传递对象时需要@Output 事件发射器?

最佳答案

不同之处在于对象属性是可变的,而字符串不是(与所有其他基本类型 boolean、number、symbol、null 和 undefined https://developer.mozilla.org/de/docs/Web/JavaScript/Datenstrukturen 一样)。

一个对象作为引用传递,因此您的祖 parent 、 parent 、 child (无论您将其传递到哪里)都有对同一对象的引用,而字符串作为副本传递。
如果你传递一个字符串,每个人都会得到一个与源完全无关的副本(除了它具有相同的值)。

您可能会争辩说对象的属性也是一个字符串。如果对象的字符串属性被修改,一个不同的字符串被设置为值,但是因为没有直接引用字符串而是通过对象引用,当他们访问字符串属性时,他们得到新的值。

关于Angular2 变化检测 - 对象与字符串输入属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35393980/

相关文章:

Angular 柔性布局性能

懒惰路线上的 Angular 问题

javascript - 通过对象动态函数分配和调用,Angular 6?

javascript - AngularJS $rootScope.$on 在迁移到 Angular2 的上下文中的替代方案

angular - 即使输入未更改,在更改检测周期期间也会使用 OnPush 策略更新 View 的 DOM

javascript - 如何从angular2中输入的文本动态设置超链接并使其可通过url点击?

json - Angular 6 - 解析 JSON

javascript - primeNg 数据表中的复选框绑定(bind)对象

javascript - Angular - 无法看到 Angular2 如何从服务自动更新数据

javascript - Bootstrap 下拉菜单需要 Popper.js 和 Angular 2 项目