6

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

应该是?或者 UI 散列RegionsLayout?

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')
        );
    }
});
4

1 回答 1

11

这应该按照您期望的方式工作。木偶源中有问题的代码在这里:https ://github.com/marionettejs/backbone.marionette/blob/master/src/marionette.itemview.js#L49-L51

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

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


更新:

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

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

我还将在 github 问题列表中添加一个问题,以寻找更好的解决方案。我不知道我什么时候才能做到这一点,但这至少会在要修复的事情清单上得到它。

于 2013-02-12T20:05:31.830 回答