Ember。为编辑表单选择双向绑定

时间:2014-03-03 09:29:35

标签: javascript ember.js

在我的ember应用程序中,我在模板中定义了一个这样的select元素:

{{view Ember.Select
    content=greetings
    optionValuePath="content.id"
    optionLabelPath="content.code"
    value=selectedGreeting
    selection=selectedGreeting
    prompt="Please choose"}}

此页面的控制器(用于创建和编辑表单的共享表单和控制器)如下所示:

greetings: [
    {code: "Mr.", id: 1},
    {code: "Mrs.", id: 2}
],
selectedGreeting: null,
actions: {
    save: function(){
        var person = this.get('model');
        if (person == null || person.id == undefined)
        {
            // create mode
            var greeting = this.selectedGreeting.id;
            // ....
            var newPerson = this.get('store').createRecord('person',{
                greeting: greeting,
                // ..
            });
            newPerson.save();
            this.transitionToRoute('index');
        }
        else
        {
            // edit mode
            person.set('greeting', this.selectedGreeting.id);
            person.save();
        }
    }
}

这在创建新人时非常有用,但在打开现有人时,选择框会显示promt而不是保存的值(我真的必须使用jQuery吗?)。

此外,我认为必须有一种更简单的方法来使用else分支中的选定值更新现有模型,因为其他属性会自动修改。

任何建议都会受到赞赏,不幸的是,Ember的文档在这种情况下没有太大帮助。

2 个答案:

答案 0 :(得分:1)

Ember.Select视图有很多怪癖。事实上,如果我没记错的话,我在Github上看到了一个问题就是重写整个事情。目前,我假设prompt属性优先于selection属性。为了解决这个问题,我只想在模板中使用条件。

{{#if model}}
    {{view Ember.Select ... value=selectedGreeting}}
{{else}}
    {{view Ember.Select ... prompt='Please Choose'}}
{{/if}}

此外,您的第二个问题,如果我理解正确,您应该能够使用selection=model.greeting将选择值绑定到模型属性。如果你使用上面的模板,你可以这样做,它只适用于前者,而不适用于后者。

答案 1 :(得分:1)

我使用以下方法修复了它:

{{view Ember.Select
    content=greetings
    optionValuePath="content.id"
    optionLabelPath="content.code"
    value=model.greeting
    prompt="Please select"
}}

这有两种方式 - 从模型加载数据并将数据保存到模型。提示不会干扰我所经历的价值。