【问题标题】:Backbone.js Events binding. Like "delegate" in Jquery?Backbone.js 事件绑定。就像 Jquery 中的“代表”?
【发布时间】:2011-10-18 03:47:41
【问题描述】:

我是backbone.js 的新手。我在 Backbone.js 中看到了事件绑定:

var PersonView = Backbone.View.extend({
    ....
    events : {
        "click button.btnSay" : "saySomething"
    },

    saySomething : function(){
        ....
    }
    ...
});

...调用时不需要button.btnSay存在,和Jquery中的“delegate”很像。

现在,问题是,我们可以将 html 页面中的任何 按钮 更改为 .btnSay(通过 Firebug 等)。他们最终得到了听众。我们如何防止这种情况发生?

【问题讨论】:

    标签: jquery backbone.js


    【解决方案1】:

    在底层,Backbone 使用 jQuery 的“委托”来连接事件。所以这不是“像”jQuery,而是 jQuery 为我们做的。

    为了防止范围界定问题并确保我们的 View 事件仅适用于我们想要的 HTML/DOM 元素,所有 events 声明的范围都限定为 View 的 el

    当 Backbone 视图被实例化时,el 属性要么为您生成,要么由您分配。这使您有机会将视图附加到 DOM 的现有块或创建可以附加到 DOM 的新 HTML 块。

    以下是附加到现有 DOM 的方法:

    MyView = Backbone.View.extend({
      // ...
    });
    
    

    var existingDomEl = $("#someElement"); new MyView({ el: existingDomEl });

    通过在实例化视图时指定el,或直接在视图定义中指定它,我们使用现有元素。

    如果我们从构造函数选项和视图定义中省略el,Backbone 将为我们生成一个el。默认情况下,它会在视图实例化时在el 中生成一个div。

    一旦一个视图拥有它的el,无论是通过生成还是赋值,视图的事件声明都通过jQuery委托,作用域为视图的el

    假设您有以下 html:

    <div id="foo">
      <button class="btnSay">Say!</button>
    </div>
    <div id="bare">
      <button class="btnSay">Say, Part 2!</button>
    </div>
    

    使用您的示例视图,我们可以将视图分配给 foobar 元素,并且只有该元素中的按钮会获得点击事件。

    
    var PersonView = Backbone.View.extend({
        ....
        events : {
            "click button.btnSay" : "saySomething"
        },
    
        saySomething : function(){
            ....
        }
        ...
    });
    
    new PersonView({
      el: $("#foo")
    });
    

    现在,当您单击 foo div 中的按钮时,您将触发 saySomething 回调。但由于 PersonView 的事件范围在该 PersonView 实例的 el 内,因此单击 bar 内的按钮将永远不会触发回调。

    【讨论】:

    • 你摇滚! :)...我希望我能选择你的两个作为我的答案。
    • 谢谢! :) @mu 的回答也很好。我喜欢他指出在服务器端保护自己。 ...但是对我的回答投赞成票会很好:)
    【解决方案2】:

    它与delegate 不同,它使用delegate(除非事件没有选择器)。 Backbone 中的事件绑定如下所示:

    if (selector === '') {
      $(this.el).bind(eventName, method);
    } else {
      $(this.el).delegate(selector, eventName, method);
    }
    

    所以它在视图元素上使用delegate。这至少将事件限制在视图内的元素中。

    您无法阻止人们在调试器中弄乱您的元素和事件。他们可以更改 HTML、CSS,甚至编辑您的 JavaScript,因此您无法阻止他们在您的页面上造成问题。不过,您可以阻止他们在您的服务器上弄得一团糟,只是不要信任 Backbone 发送到您的服务器的任何内容,并以与验证来自外部世界的任何其他内容相同的方式验证所有内容。

    基本上,不要浪费您的时间担心有人会因为弄乱您的 HTML/事件/JavaScript 而用砖头砸自己的脸。让他们随心所欲地伤害自己。但是,请不要信任来自外部世界的任何东西来保护您的服务器(而且您的服务器甚至不应该比他们必须的更信任自己)。

    【讨论】:

    • 非常感谢:)。你刚刚把我吵醒了。我太关心 HTML/events/JavaScript。
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多