BackboneJS:如何从视图的事件哈希中调用视图外部的函数?

6
作为一个例子,这是我要做的事情...
function doSomething(customParameter) {
    console.log(customParameter);
}

var MyView = Backbone.View.extend({
    // Other view stuff, skipping it...
    events: {
        'click .someClass': doSomething(customParameter)
    }
});

这里的动机是我希望能够将变量(局部于视图)传递给视图外的某些其他函数。我这么做的原因是,这样“其他函数”只需要编写一次,而不是四次……这将严重节省我项目中的100多行代码。
经过多次搜索,我还没有找到解决方案……有什么想法吗?
谢谢!
2个回答

6
这是一种做法:

这是一种做法:

function doSomething(customParameter) {
    console.log(customParameter);
}

var MyView = Backbone.View.extend({
    // Other view stuff, skipping it...
    events: {
        'click .someClass': function(ev) { doSomething(this.customParameter); }
    }
});

在这个例子中,您声明了一个函数,该函数将从本地视图传递所需的参数到doSomething方法。
另一种方法是使用当前视图的上下文调用doSomething(),如果您不想传递所有必需的参数:
function doSomething(ev) {
    console.log(this.customParameter); // here, the context this will be the view.
}

var MyView = Backbone.View.extend({
    // Other view stuff, skipping it...
    events: {
        'click .someClass': function(ev) { doSomething.call(this, ev); }
    }
});

更符合面向对象编程的方式是使用一个基础的 View 来处理通用代码:
var MyBaseView = Backbone.View.extend({
    doSomething: function(ev) {
        console.log(this.customParameter);
    }
});

var MyView = MyBaseView.extend({
    extends: {
        'click .someClass': 'doSomething'
    }
});

可能有更多的方法,只需找出哪种情况最适合您的需求。


2
哇,为什么以前我从来没有想过扩展自己的一个视图?我的代码本可以更加简洁。@PlanetLotus,最后一个选项可能是最好的选择。 - RustyToms
哈哈,我也从未想过在Backbone代码中扩展我的视图。非常感谢,我会尝试最后两个选项,看哪一个对我最好! - MattM
最后一个选项到目前为止运作得非常好。非常感谢! - MattM

3
你可以尝试调用视图内部的方法,该方法会调用相关的方法。
var MyView = Backbone.View.extend({
    // Other view stuff, skipping it...
    events: {
        'click .someClass': 'callSomething'
    },
    callSomething: function() {
        doSomething(customParameter);
    }
});

我目前正在做这件事。问题在于callSomething函数在多个视图中重复出现。虽然它能够工作,但是代码浪费很大。我想将其提取到视图之外的函数中,以便可以在任何地方调用。正如他们所说的:“编写一次,到处运行” :) 唯一的区别在于视图变量。 - MattM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接