gpt4 book ai didi

javascript - 在更改事件处理程序中(重新)渲染 Backbone View 不起作用

转载 作者:行者123 更新时间:2023-11-27 23:08:38 29 4
gpt4 key购买 nike

我有两个表单元素,都是通过backbone.stickit 进行双向数据绑定(bind)的。第二个表单元素(#input)只是装饰性的 - 用于显示它实际上正在工作。

这个想法是,每次下拉(#select)菜单中的选项发生更改时,我的 View 都会(重新)渲染。

我试图通过捕获 #select 的“changed”事件并调用 this.render() 来(重新)渲染 View 来实现这一目标。

显然这不起作用。所选选项不会保存回模型中,我不明白为什么。

我不是在寻找解决方案,而不是解释,为什么以下代码不起作用。解决方案(如:对我有用)是 fiddle 的一部分 - 已注释掉。

HTML:

<script type="text/template" id="tpl">
<h1>Hello <%= select %></h1>
<select id="select">
</select>
<p>Select:
<%= select %>
</p>
<hr>
<input type="text" id="input">
<p>Input:
<%= input %>
</p>
</script>

<div id="ctr"></div>

JavaScript:

Foo = Backbone.Model.extend({
defaults: {
select: "",
input: "",
}
});
FooView = Backbone.View.extend({
el: '#ctr',
template: _.template($('#tpl').html()),
initialize() {
this.model.bind('change', function() {
console.log("model change:");
console.log(this.model.get('select'));
console.log(this.model.get('input'));
}, this);
//this.model.bind('change:select', function() { this.render(); }, this); // <--------------------- WORKS
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
this.stickit();
return this;
},
events: {
'change #select': function(ev) {
console.log('change event triggered:');
console.log(this.model.get('select'));
console.log(this.model.get('input'));
this.render(); // <--------------------- DOES NOT WORK - WHY?
},
/* 'click #render': function(ev) {
console.log('render event triggered:');
console.log(this.model.get('select'));
console.log(this.model.get('input'));
this.render();
} */
},
bindings: {
'#input': 'input',
'#select': {
observe: 'select',
selectOptions: {
collection: function() {
return [{
value: '1',
label: 'Foo'
}, {
value: '2',
label: 'Bar'
}, {
value: '3',
label: 'Blub'
}]
}
}
},
},
});
new FooView({
model: new Foo()
}).render();

https://jsfiddle.net/r7vL9u07/9/

最佳答案

change #select 事件处理程序中调用 this.render() 不起作用的原因是您破坏了双向数据绑定(bind), Backbone.stickit正在为您提供。流程如下:

  • 用户更改“#select”的值。
  • 您的 change #select 处理程序将触发并调用 this.render()
  • render 使用新的选择菜单重新填充 #ctr,但未选择任何选项
  • Backbone.stickit 响应对 #select 的更改。
  • Backbone.stickit 尝试获取#select 的值,但由于它不包含选定的选项,因此该值为未定义。<
  • Backbone.sticket 将模型select 属性设置为未定义

如果将 this.render() 调用移至 modelchange:select 处理程序中,它会起作用的原因是Backbone.stickit 能够正确更新模型,而无需在有机会之前更改 DOM。

关于javascript - 在更改事件处理程序中(重新)渲染 Backbone View 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380398/

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