我对Backbone.js很新,但我很确定我做得对。
以下是我的Backbone视图和模型:
//用户模型
var User = Backbone.Model.extend({
defaults: {
UserID: 0,
FirstName: "",
LastName: "",
Assignment: 0,
Selected: false
},
toggle: function (){
var value = this.get("Selected");
this.set({ Selected : !value });
}
});
//用户视图
var UserView = Backbone.View.extend({
parentview: null, // the parent view
initialize: function () {
this.parentview = this.options.parentview
this.template = $("#user-template")
this.model.bind("change", this.render, this);
},
render: function () {
var content = this.template.tmpl(this.model.toJSON());
$(this.el).html(content);
return this;
},
events: {
"click ul li": "toggle"
},
toggle: function () {
this.model.toggle();
}
});
这是我为每个用户的视图使用的JQuery模板。视图在另一个大视图中呈现,即集合。
<ul id="user-container"
{{if Selected == 1 }} class="selected" {{/if}}
>
<li class="col1" {{if Selected == 0}} style="visibility:hidden" {{/if}} >
<img src="@Content.ImageUrl("pin-icon.png", "base")" />
</li>
<li class="col2">${FirstName} ${LastName} </li>
<li class="col3-last">
<input id="radio-${$item.view}-PM-${UserID}" name="radio-${$item.view}-${UserID}" type="radio" value="1" class="button"
{{if Assignment == 1}} checked="checked" {{/if}}
/>
<label for="radio-${$item.view}-PM-${UserID}">
PM</label>
<input id="radio-${$item.view}-SV-${UserID}" name="radio-${$item.view}-${UserID}" type="radio" value="2" class="button"
{{if Assignment == 2 }} checked="checked" {{/if}}
/>
<label for="radio-${$item.view}-SV-${UserID}">
STAFF</label>
<input id="radio-${$item.view}-NA-${UserID}" name="radio-${$item.view}-${UserID}" type="radio" value="0" class="button"
{{if Assignment == 0 }} checked="checked" {{/if}}
/>
<label for="radio-${$item.view}-NA-${UserID}">
NONE</label>
</li>
</ul>
在最后li
我有三个单选按钮,带有动态ID和相同的名称(也是动态的)。每个按钮都有自己的标签。
一切正常,单选按钮正在选择并完成工作,直到我在视图的事件中添加了这一行"click ul": "toggle"
。
该事件有效,当我点击视图中的每个用户的行时,模型会更新,并且用户被选中/取消选择。
唯一的问题是,使用此行,单选按钮不起作用。 设置了值,但是当我尝试更改值时没有任何反应(单击另一个单选按钮)。
浏览器控制台没有生成错误,这很奇怪......
更正:单击单选按钮时,会触发骨干视图中的单击事件,选择正在完成,但按钮保持未选中状态。似乎骨干接管了,但我想要的只是在我点击
ul
部分时触发,而不是在内部的其他元素上触发,如按钮等。但是,当我点击按钮的标签时,没有任何反应。没有触发骨干事件,也没有选择任何按钮。
任何人都知道为什么会发生这种情况?
答案 0 :(得分:5)
在UI中未更改复选框,因为无论何时单击复选框,click事件都会传播到“li”元素并调用切换回调。当调用切换回调时,您将重新渲染整个视图,并且由于您的用户模型的“Assignment”属性未被更改,因此您将使用与“已检查”状态相同的状态重新渲染视图。之前。
您可以通过阻止点击事件在单选按钮初始化时传播来解决此问题。例如,将以下单选按钮单击处理程序添加到视图中:
events: {
"click input[type=radio]": "onRadioClick",
"click ul li": "toggle"
},
onRadioClick: function (e) {
e.stopPropagation();
this.model.set({ Assignment: $(e.currentTarget).val() }, {silent:true}); // {silent: true} is optional. I'm only doing this to prevent an unnecessary re-rendering of the view
},
只要单击单选按钮,就会拦截click事件,并阻止调用切换回调。请注意,我还要更新User模型上的Assignment属性,以便下次重新渲染视图时,将正确设置已检查状态。