gpt4 book ai didi

javascript - 如何将空白选项添加到 Marionette CollectionView 生成的选择中?

转载 作者:行者123 更新时间:2023-12-02 16:29:57 25 4
gpt4 key购买 nike

我将 Backbone 集合渲染为 select 元素,并且我希望它在顶部有一个空白的 option

我有点不确定如何使用 Marionette CollectionView 最好地做到这一点。 (我知道 CompositeView 但我真的不觉得它适合这个用例)。

到目前为止,我已经尝试使用 onBeforeRender Hook 来添加选项

onBeforeRender: function() {
var option = $('<option>').html('')
this.$el.append(option);
}

我面临的问题是渲染实际上被调用了两次,因为我的CollectionView位于LayoutView内部,它在显示 View 时调用渲染函数

this.getRegion('body').show(new SelectView({
collection: collection
}));

然后当其集合重置时再次触发渲染

collection.reset([{ name: 'a' },{ name: 'b' }]);

我已经通过使用调试器并查看调用堆栈验证了所发生的情况。

完整片段:

$(document).ready(function() {

var collection = new Backbone.Collection({
model: Backbone.Model
});


var Layout = Backbone.Marionette.LayoutView.extend({

regions: {
body: '#main'
},

template: false,

onRender: function() {
this.getRegion('body').show(new SelectView({
collection: collection
}));
}
});

var OptionView = Backbone.Marionette.ItemView.extend({
tagName: 'option',
template: _.template('<%= name %>')
});

var SelectView = Backbone.Marionette.CollectionView.extend({
tagName: 'select',
childView: OptionView,
onBeforeRender: function() {
var option = $('<option>').html('')
this.$el.append(option);
}
});

var layout = new Layout({
el: $('#app')
});
layout.render();
var app = new Marionette.Application();

app.start();
Backbone.history.start();

collection.reset([{ name: 'a' },{ name: 'b' }]);
});
<script data-require="underscore.js@1.6.0" data-semver="1.6.0" src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js"></script>  
<script data-require="jquery@2.1.3" data-semver="2.1.3" src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script data-require="backbone.js@1.1.2" data-semver="1.1.2" src="http://backbonejs.org/backbone-min.js"></script>
<script data-require="marionette.js@2.2.2" data-semver="2.2.2" src="http://cdnjs.cloudflare.com/ajax/libs/backbone.marionette/2.2.2/backbone.marionette.js"></script>

<body>
<div id="app">
<div id="main"></div>
</div>
</body>

现在,在这个代码片段中,我可以通过简单地在脚本开头而不是末尾重置集合来解决问题,但在我的应用程序中,这不是一个可能的解决方案。

我可以想到一些解决方案,但它们都感觉有点不对,在我看来,我肯定不想为此保持任何状态。我能想到的最糟糕的事情就是更改为

onBeforeRender: function() {
this.$el.html('')
var option = $('<option>').html('')
this.$el.append(option);
}

但是由于框架似乎没有清空 $el 本身,我猜这是有原因的。

这是 CompositeView 的合法用例吗?还是有其他我错过的智能方法来做到这一点?

最佳答案

如果 CompositeView 适合此用例,解决方案是将 CollectionView 更改为

var SelectView = Backbone.Marionette.CompositeView.extend({
template: _.template('<select><option></option></select>'),
childView: OptionView,
childViewContainer: 'select'
});

如以下代码片段所示:

$(document).ready(function() {

var collection = new Backbone.Collection({
model: Backbone.Model
});


var Layout = Backbone.Marionette.LayoutView.extend({

regions: {
body: '#main'
},

template: false,

onRender: function() {
this.getRegion('body').show(new SelectView({
collection: collection
}));
}
});

var OptionView = Backbone.Marionette.ItemView.extend({
tagName: 'option',
template: _.template('<%= name %>')
});

var SelectView = Backbone.Marionette.CompositeView.extend({
template: _.template('<select><option></option></select>'),
childView: OptionView,
childViewContainer: 'select'
});

var layout = new Layout({
el: $('#app')
});
layout.render();
var app = new Marionette.Application();

app.start();
Backbone.history.start();

collection.reset([{ name: 'a' },{ name: 'b' }]);
});
<script data-require="underscore.js@1.6.0" data-semver="1.6.0" src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.6.0/underscore-min.js"></script>  
<script data-require="jquery@2.1.3" data-semver="2.1.3" src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script data-require="backbone.js@1.1.2" data-semver="1.1.2" src="http://backbonejs.org/backbone-min.js"></script>
<script data-require="marionette.js@2.2.2" data-semver="2.2.2" src="http://cdnjs.cloudflare.com/ajax/libs/backbone.marionette/2.2.2/backbone.marionette.js"></script>

<body>
<div id="app">
<div id="main"></div>
</div>
</body>

关于javascript - 如何将空白选项添加到 Marionette CollectionView 生成的选择中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com