0

在我的应用程序中,我有一个扩展Em.Select视图:

App.SelectField = Em.Select.extend({
    attributeBindings: ['disabled'],
    actions: {
        setFocus: function(){
            this.$().focus();
        }
    }
});

在我的车把模板中使用:

{{view App.SelectField 
    viewName="cbAddressType"
    disabledBinding='getIsDisabled'
    contentBinding="controllers.addressTypes"
    optionValuePath="content.id"
    optionLabelPath="content.addressTypeName"
    valueBinding="getSetAddressType"}}

视图disabledBinding绑定到视图的控制器属性getIsDisabled。当此属性更改时,选择视图将启用或禁用。这工作得很好。

但是,我对模板也有一个操作:

<button {{action "editRecord" view.cbAddressType}}>Edit</button>

这调用了控制器的editRecord动作:

actions: {
    editRecord: function (fieldToFocusOn) {
            this.toggleProperty('isEditing');
            if (fieldToFocusOn  && this.get('isEditing'))
            {
                fieldToFocusOn.send("setFocus");
            }
    }
}

它将动作发送setFocus到上面SelectField,后者又focus()在选择控件上运行该方法。

问题是在 Select 上的属性被控制器中绑定属性的更改值更新focus()之前触发。disabledBinding控件在启用之前无法接收焦点。我尝试了一个while select.disabled [wait] loop,但这只是导致了一个无限循环,因为看起来视图在setFocus被调用之后才被刷新——它们不是异步运行的。

我还注意到,在 aEmber.TextFieldreadonlyBinding不是 adisabledBinding上,这种方法可以正常工作:在readonly触发 focus() 事件之前删除文本字段的属性。

感谢任何建议。

4

1 回答 1

1

未经测试,但可以工作。在您的App.SelectField使用中:

setFocus: function(){
  Ember.run.schedule('afterRender', this, function() {
    this.$().focus();
  });
}
于 2013-09-11T13:25:18.650 回答