0

有没有办法将 bindData 传递给 Marionette's bindTo,类似于 jQuery 的绑定?

我在 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);

第二个绑定
这是我失败的地方:(
我想将自定义数据对象传递给函数。
在另一个函数中,我想显示 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,因此我可以向它添加一个类。

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

4

1 回答 1

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.foo

您还可以在对象内发送更多数据 { 'foo1': 'bar1', 'foo2': 'bar2' }

我喜欢使用应用事件管理器。

于 2013-03-13T14:49:35.633 回答