【问题标题】:Using variable for selectors in events在事件中为选择器使用变量
【发布时间】:2014-11-18 00:47:01
【问题描述】:

出于某种原因,我需要使用一个变量作为主干中事件的选择器,但我不知道如何做到这一点:

app.views.Selfcare = Backbone.View.extend({
    events: {
        click window.parent.document .close : "closeWindow"
    },
    closeWindow: function() {
        //code
    }
});

我必须使用不同的范围,我不能执行“click .close”:“closeWindow”。

感谢您的帮助。

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

    我查看了 Backbone.js 的源代码,发现如果您的视图的 events 是一个函数,则调用该函数并将其返回值用作 events 对象。

    这意味着您的代码可以这样更改:

    app.views.Selfcare = Backbone.View.extend({
      events: function() {
        var _events = {
          // all "standard" events can be here if you like
        }
        _events["events" + "with variables"] = "closeWindow";
        return _events;
    
      },
      closeWindow: function() {
        //code
      }
    });
    

    THIS是源码中有趣的部分:

    if (_.isFunction(events)) events = events.call(this);
    

    更新:

    示例可在 JSFiddle HERE** 上找到

    【讨论】:

    • 不错。我会在接下来的几个小时里试试这个,然后告诉你。非常感谢。
    • @Flyingbeaver 我用一个愚蠢的例子的链接更新了我的答案。祝你好运! :)
    【解决方案2】:

    我不确定您是否可以在那里使用变量。您可以使用内置的事件方法(请参阅documentation)添加自定义侦听器,然后将事件侦听器添加到window.parent.document 以触发该自定义事件(使用Events.trigger 方法)。

    也就是说,将这个事件与 Backbone 完全分离会容易得多(除非你不想这样做),然后沿着 addEventListener 路线走:

    app.views.Selfcare = Backbone.View.extend({
        initialize: function() {
            _.bindAll(this, 'render', 'closeWindow');
            if(this.options.clickTarget) {
                this.options.clickTarget.addEventListener('click', this.closeWindow, false);
            }
        },
        render: function() {
            // Render to the DOM here
            return this; // as per Backbone conventions
        },
        closeWindow: function() {
            // Stuff here
        }
    });
    
    // Usage:
    var mySelfcare = new app.views.Selfcare({
        clickTarget: window.parent.document
    });
    

    我认为这应该可行,虽然我还没有测试过(可能存在一两个语法错误!)

    【讨论】:

    • 举个例子,谢谢,我也在考虑举办这个活动,但是我可以有很多。 Dzejkej 解决方案似乎很有趣。
    • @Flyingbeaver:是的,我也看到了这个解决方案,优雅 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多