Backbone Marionette Layout的UI哈希问题

时间:2013-02-12 17:49:12

标签: backbone.js marionette

在以下Layout中,我添加CollectionView以在onRender中显示SELECT列表。紧接着,我使用ui哈希来启用或禁用视图中的所有控件。这不适用于new App.View.Categories生成的SELECT。

应该吗?或者,在Regions内的Layout内,用户界面哈希不起作用吗?

App.View.UploadFile = Backbone.Marionette.Layout.extend({
    template: '#upload-file-template',
    regions:{
        category: 'td:nth-child(4)'
    },
    ui:{
        inputs: 'textarea, select, .save'
    },
    onRender: function(){
        this.category.show(
            new App.View.Categories({
                collection: App.collection.categories
            }) // generates the SELECT list
        );

        console.log(this.ui.inputs); // Length 2. Missing select.
        console.log(this.$('textarea, select, .save')); // Length 3

        this.ui.inputs.prop(
            'disabled', (this.model.get('upload_status')!='staged')
        );
    }
});

1 个答案:

答案 0 :(得分:11)

这应该按照您期望的方式工作。 Marionette来源中的相关代码位于:https://github.com/marionettejs/backbone.marionette/blob/master/src/marionette.itemview.js#L49-L51

bindUIElements()的调用将ui散列转换为jQuery选择器对象,并在调用onRender方法之前调用它。

你看到错误吗?或者选择器什么都不返回,对元素没有影响?


更新

啊!当然......我没有足够关注你的代码。你是正确的,因为UI元素选择器发生在你将子视图添加到区域之前。我以前从未遇到过这种情况......但这似乎是我们想要修复/支持的事情。

目前,我建议的最好的解决方法是调用'this.bindUIElements();'在你的onRender方法的最后。这将强制ui元素重新绑定到选择器。

我还会在github问题列表中添加一个问题,以便为此寻找更好的解决方案。我不知道什么时候能够达到这一目标,但这至少会将其列入要修复的事项列表中。