Angular2布尔输入参数不起作用

Posted

技术标签:

【中文标题】Angular2布尔输入参数不起作用【英文标题】:Angular2 boolean Input parameter not working 【发布时间】: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

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

【问题讨论】:

Update parent component property from child component in Angular 2的可能重复 【参考方案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 方法执行双向绑定。这使得它更加冗长,但它可能对一些更复杂的情况有用。 ***.com/a/39943368/1122813 @JakobLithner 想想你的最后一个“3”。观点。这可能有效,但前提是您仅依靠 @Input() 来获取该属性的值。如果你这样做,双向绑定就成为强制性的。

以上是关于Angular2布尔输入参数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 ngModel 的 Angular 2 双向绑定不起作用

使用 ngModel 的 Angular 2 双向绑定不起作用

使用 ngModel 的 Angular 2 双向绑定不起作用

使用 ngModel 的 Angular 2 双向绑定不起作用

angular2 Typescript中的Jquery不起作用

动态样式在Angular2中不起作用