Marionette使用bindTo传递bindData

时间:2013-02-27 07:32:39

标签: javascript-events bind jquery marionette

有没有办法将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,所以我可以添加一个类。

我只是以错误的方式接近这个吗?任何输入都会有所帮助。谢谢!

1 个答案:

答案 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。