我需要为Backbone中的events对象中使用的函数提供参数。
var DocumentRow = Backbone.View.extend({
tagName: "li",
className: "document-row",
events: {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
},
render: function () {
// do something
}
});
现在让open的定义为:
function open(id) {
if (id) {
// do something
} else {
// do something else
}
}
我将从另一个函数调用open,并在调用它时传递id。所以根据我是否传递id,我需要做不同的事情。我如何在Backbone中执行此操作? 目前,通过点击调用id我希望它是未定义的。但是传递了一个事件对象。
为什么会发生这种情况?如何传递参数?
答案 0 :(得分:5)
另一种解决方法是使用一种完全不同的方法来处理点击,并调用“open”,以便其他进程可以调用它。正如另一个人所提到的,你在事件哈希中指定的方法是jquery委托包装器,因此对于params你可以做的事情并不多,因为你将得到的是委托提供的内容。因此,在这种情况下,创建另一个方法来执行将调用open的实际图标点击:
events: {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
},
/**
* Specifically handles the click and invokes open
*/
handleIconClick : function(event) {
// ...process 'event' and create params here...
this.open(params);
},
/**
* This can be called remotely
*/
open : function(id) {
if (id) {
// do something
} else {
// do something else
}
}
答案 1 :(得分:4)
你可以在这里看到:http://backbonejs.org/docs/backbone.html#section-156
最关键的一句是:
this.$el.delegate(selector, eventName, method);
因为backbone的事件是jquery的委托(http://api.jquery.com/delegate/),所以传递的参数只是jquery的委托默认参数传递。
您可以像这样更新代码:
......
open : function(event) {
//get id from event
var id = event.xxx ;//pseudo code
if (id) {
this.openid(id);
} else {
// do something else
}
},
//your another function direct call openid
openid: function(id){
// do something
}
......
答案 2 :(得分:2)
如果您知道ID变量的类型,可以使用javascript typeof()
检查是否为true,或者您可以检查ID是否是来自UnderscoreJS的_.isObject的对象
答案 3 :(得分:0)
我认为Brendan或者fejustin的答案是最好的(实际上我投票给他们)。但是如果你真的致力于只有一个函数,你可以使id
成为第二个参数并忽略第一个参数。
open : function(evt, id){
if(id){
//whatever
} else {
}
},
someOtherMethod : function(){
this.open(null, id);
}