在以下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')
);
}
});
答案 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问题列表中添加一个问题,以便为此寻找更好的解决方案。我不知道什么时候能够达到这一目标,但这至少会将其列入要修复的事项列表中。