有没有办法将bindData传递给Marionette的bindTo,类似于jQuery的bind?
我在jQuery的网站上看到你可以执行以下操作来传递bindData:
function myFunction(event){
console.log(event.data.foo); // output "bar"
};
$(".some-element").bind("click", {foo:"bar"}, myFunction);
我之所以这样做是因为我将多个功能绑定到一条路线。
第一个函数只使用路径中的参数,没什么特别的 第二个函数需要传递给它的自定义数据,这是bindData的用武之地。
控制器和路由器
var Controller = {
page1: function(itemId){
Vent.trigger('openPageOne', itemId);
}
};
var AppRouter = Marionette.AppRouter.extend({
controller: Controller,
appRoutes: {
"page1/:itemid" : "page1"
},
start: function() {
Backbone.history.start();
}
});
首次绑定
这很好用,导航到那条路线时我在控制台上打印了itemId。
var MyLayout = Marionette.Layout.extend({
initialize: function(){
_.bindAll(this);
},
myFunction: function(itemId){
console.log(itemId);
}
});
var myLayout = new MyLayout();
myLayout.bindTo(Vent, "openPageOne", myLayout.myFunction);
第二次绑定
这是我失败的地方:(
我想将自定义数据对象传递给该函数
在anotherFunction里面,我想显示foo的值。
var AnotherLayout = Marionette.Layout.extend({
initialize: function(){
_.bindAll(this);
},
anotherFunction: function(event){
// Here is where I want to use foo
console.log(event.data.foo);
}
});
var anotherLayout = new AnotherLayout();
anotherLayout.bindTo(Vent, "openPageOne", {foo:"bar"}, anotherLayout.anotherFunction);
更具体地说,第一个函数应该改变我的页面内容。第二个功能应突出显示导航菜单中的项目。我想发送给我的函数的自定义对象基本上是菜单项的元素ID,所以我可以添加一个类。
我只是以错误的方式接近这个吗?任何输入都会有所帮助。谢谢!
答案 0 :(得分:1)
不确定这是否会有所帮助,但我倾向于在Marionette中使用Vent。
var app = new Backbone.Marionette.Application();
然后我使用listenTo(替换bindTo)事件来触发,当它触发时我触发,
app.vent.trigger('App:openPageOne', { 'foo': 'bar'});
然后在你的发泄听众中
app.vent.on('App:openPageOne', function(data) {
}
您的数据将被发送到data参数:data.foo
您还可以在对象内发送更多数据{'foo1':'bar1','foo2':'bar2'}
我喜欢使用app event manager。