【问题标题】:backbone.js event binding is breaking radio buttons functionality主干.js 事件绑定正在破坏单选按钮功能
【发布时间】:2011-08-24 17:49:07
【问题描述】:

我对 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 部分时触发,而不是在内部的其他元素(如按钮等)上触发。

但是,当我单击按钮的标签时,没有任何反应。没有触发主干事件,也没有选择按钮。

有人知道为什么会发生这种情况吗?

【问题讨论】:

    标签: javascript jquery javascript-events backbone.js


    【解决方案1】:

    UI 中的复选框不会更改,因为每当单击复选框时,单击事件都会传播到“li”元素并调用切换回调。当调用切换回调时,您将重新渲染整个视图,并且由于您的用户模型的“分配”属性没有被更改,您正在重新渲染具有相同“已检查”状态的视图之前。

    您可以通过在单选按钮初始化时阻止单击事件的传播来解决此问题。例如,将以下单选按钮单击处理程序添加到您的视图中:

            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
            },
    

    这将在单击单选按钮时拦截单击事件,并防止调用您的切换回调。请注意,我还将更新您的 User 模型上的 Assignment 属性,以便当您的视图下次重新渲染时,您的选中状态将被正确设置。

    【讨论】:

    • 您好约翰尼,谢谢您的回答。我最终完全按照您的建议解决了这个问题,但我不确定这是否正常。我现在明白为什么会这样了。再次感谢。
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2021-12-27
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多