【问题标题】:Angular 2 Bind Selected Attribute to Dynamically Created OptionsAngular 2 将选定属性绑定到动态创建的选项
【发布时间】:2016-07-08 22:49:53
【问题描述】:

我正在使用 Angular 2 RC4。

我创建了一个下拉选择元素,它绑定到我的组件中的一个变量,并使用*ngFor为此选择创建选项,如下所示:

<select id="role-select" class="form-control" [(ngModel)]="foo.bars" multiple>
    <option *ngFor="let bar of bars">{{bars}}</option>
</select>

bars 变量是动态填充的:

ngOnInit(){
    this._service.GetBars().subscribe(
        result => {
            this.bars = result;
        },
        err => {
            console.log(err);
        },
        () => {}  
    );
}

我还动态填充了foo.bars 变量:

constructor(public _service: Service){
    _service.GetFooBars()
        .subscribe((data) => {
            this.foo.bars = data;
        },(err) => {
            console.log(err);
        },  () => {
            // done                    
        });
}

现在我要做的是在与foo.bars 中的bars 匹配的任何选项上将selected 属性设置为true。 目前我使用这个:

var roleSelect = document.getElementById("role-select");
this.foo.bars.forEach((v,i) => {
    for (var j = 0; j < roleSelect.options.length; j++) {
        if (roleSelect.options[j].text === v) {
            roleSelect.options[j].selected = true;
        }
    }
});

这工作得很好,但是转译器会抛出错误,说 HTMLElement[] 上不存在选项,我想要一个更强大的解决方案。

任何想法都值得赞赏。

【问题讨论】:

    标签: javascript angularjs typescript angular


    【解决方案1】:

    怎么样

    ngOnInit(){
        this._service.GetBars().contactMap(result => {
            this.bars = result;
            return this._service.GetFooBars();
        }).subscribe(
            data => {
                this.foo.bars = data;
                setSelected();
            },
            err => console.log(err)
            )
    }
    
    setSelected(){
        var roleSelect = document.getElementById("role-select");
        this.foo.bars.forEach((v, i) => {
            for (var j = 0; j < roleSelect.options.length; j++) {
                if (roleSelect.options[j].text === v) {
                    roleSelect.options[j].selected = true;
                }
            }
        });
    }
    

    但是,我认为您并不需要 setSelected 函数。

    理论上,ngModel 应该会解决这个问题。

    如果没有,可以在模板中添加[selected]="bar===foo.bars"

    <select id="role-select" class="form-control" [(ngModel)]="foo.bars" multiple>
        <option *ngFor="let bar of bars" [selected]="bar===foo.bars">{{bars}}</option>
    </select>
    

    【讨论】:

    • 不,我仍然会收到转译器错误。并且foo.bars 是一个数组,因此字符串和数组的简单比较不会给我所需的结果。但是,我很想知道 ngModel 是否会处理这个问题
    • 尝试制作一个 plunker,以便人们可以更轻松地帮助您。我没有测试我的代码,但它应该可以工作。我可以看到第一个解决方案可能仍然会导致同样的问题,您是否尝试过模板解决方案?
    • 所以你修好了?怎么样?
    • [(ngModel)] 已经这样做了,只是没有直观地显示出来
    猜你喜欢
    • 2018-09-13
    • 2011-06-03
    • 1970-01-01
    • 2017-03-02
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多