【问题标题】:Angular2 boolean Input parameter not workingAngular2布尔输入参数不起作用
【发布时间】:2017-08-25 18:50:57
【问题描述】:

在我的 Planning 组件中,我有以下指令,其中 selectedPerson 是服务上的一个对象,而 showModal 是 Planning 组件中的本地布尔参数:

<person-popup [person]="planningService.selectedPerson" [show]="showModal"></person-popup>

PersonPopop 组件具有以下简单结构:

import { Component, Input } from '@angular/core';
import { Counselor } from '../entities/counselor';
import { Person } from '../entities/person';
import { Request } from '../entities/request';


@Component({
    selector: 'person-popup',
    templateUrl: './person-popup.component.html',
    styleUrls: ['./person-popup.component.css']
})


export class PersonPopupComponent {

    @Input() person: Person;
    @Input() show: boolean;

    constructor() { }

    public displayCss() {
        return this.show ? "displayBlock" : "";
    }

    public toggleShow() {
        this.show = !this.show;
        console.log("toggleShow: ", this.show)
    }
}

对应的 HTML 视图当前如下所示:

<p>{{show}}</p>
<p>{{person?.name}}</p>
<button (click)="toggleShow()">Show</button>

<div class="modal-background {{displayCss()}}" (click)="toggleShow()">
    <div class="modal-content animate">
        {{person?.name}}
    </div>
</div>

当规划组件启动时,显示属性为null。 selectedPerson 的更改始终会传播到弹出组件,但 showModal 参数并非如此。

showModal 在父组件中首次设置为true 时,它在子组件中设置为true

然后子组件会将其本地show 属性设置为false。 之后似乎“输入连接丢失”并且showModal 的所有后续更改都不会传播到show

对如何重新设计有什么建议吗?

【问题讨论】:

标签: angular input components


【解决方案1】:

如果要将更改从子级传播到父级,则需要使用两种方式绑定:

export class PersonPopupComponent {

    @Input() person: Person;
    @Input() show: boolean;
    @Ouput() showChange= new EventEmitter<boolean>();

    constructor() { }

    public displayCss() {
        return this.show ? "displayBlock" : "";
    }

    public toggleShow() {
        this.show = !this.show;
        this.showChange.emit(this.show);
        console.log("toggleShow: ", this.show)
    }
}

然后在父级中:

<person-popup [person]="planningService.selectedPerson" [(show)]="showModal"></person-popup>

【讨论】:

  • 感谢您的快速回答!一些后续问题以确保我理解:1)你的意思是我需要做的就是在指令绑定中添加括号,并在发射器中添加相应的输出参数? 2) showChange 是一种命名约定,会自动匹配双向绑定吗? 3)发出一个值并设置本地参数会不会令人困惑?仅仅调用 this.showChange.emit(!this.show) 并让它将更改传播到 Input 参数还不够吗?
  • 1.是的。 2. Change 后缀是使用[(bananaInABox)] 表示法,但你可以将它命名为showFoo,例如,使用[show]="someData" (showFoo)="doSomething($event)" 注意你可以对(showChange)="doSomething($event)" 做同样的事情,盒子里的香蕉不是强制 3. 是的,我想这是可能的。
  • 对于未来的读者,我只是添加对另一篇文章的引用,其中使用 get/set 方法执行双向绑定。这使得它更加冗长,但它可能对一些更复杂的情况有用。 stackoverflow.com/a/39943368/1122813
  • @JakobLithner 想想你的最后一个“3”。观点。这可能有效,但前提是您仅依靠 @Input() 来获取该属性的值。如果你这样做,双向绑定就成为强制性的。
猜你喜欢
  • 2013-12-26
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2021-06-09
  • 2013-07-22
相关资源
最近更新 更多