1

我正在尝试与它的一些视图共享一个木偶应用程序。我在这里阅读了 wiki ,但是这个例子给我留下了一个问题。

我有一个文件,里面有几个视图,它们都需要使用请求/响应系统,可能还有命令。我不想var MyApp = require('app');在文件中的所有视图中都这样做。我想出了以下方法,但我认为可能有更好的方法来做到这一点。

例子:

//Views.js
define( ["marionette"], function (Marionette) {
var App = function(){
    return require('app');
};

var ExampleItemView = Marionette.ItemView.extend({
    initialize: function(){
        App().request("getInfo", "aboutStuff");
    }
});

return Marionette.CollectionView.extend({
    itemView: ExampleItemView,
    initialize: function(){
        App().request("getInfo", "aboutStuff");
    }
});

有一个更好的方法吗?

4

2 回答 2

5

我绝对不会将您app注入您的视图,因为它可以创建循环依赖项,这总是一种代码气味(无论它们是否可以解决)到目前为止,简单的解决方案是创建一个单独的(单例)reqres 对象由应用程序处理并注入到视图中。

//reqres.js
define(['backbone.wreqr'], function( Wreqr ){
    return new Wreqr.RequestResponse();
});

//app
define(['reqres'], function(reqres){
    reqres.setHandlers({
        'getInfo' : function(){
            return 'foo';
        }
    });
});

//Views.js
define( ["marionette", "reqres"], function (Marionette, reqres) {
var ExampleItemView = Marionette.ItemView.extend({
    initialize: function(){
        reqres.request("getInfo", "aboutStuff");
    }
});

return Marionette.CollectionView.extend({
    itemView: ExampleItemView,
    initialize: function(){
        reqres.request("getInfo", "aboutStuff");
    }
});
于 2013-07-29T12:51:21.623 回答
2

在 Marionette v3 的下一个主要版本中,Backbone Wreqr将被Backbone Radio取代。

要使用 Backbone Radio,您可以创建一个频道并执行以下操作:

/**
 * App.js (for example)
 */
var Radio = require('backbone.radio');
// Use the 'data' channel - this could be whatever channel name you want
var dataChannel = Radio.channel('data');

// Handler for a request
dataChannel.reply('getMessage', function(name) {
  return 'Hello ' + name + '. Alba gu brath!';
});

/**
 * View.js (for example)
 */
var Radio = require('backbone.radio');
var dataChannel = Radio.channel('data');

// Make the request
console.log( dataChannel.request('getMessage', 'Craig') ); // -> Hello Craig. Alba gu brath!
于 2014-09-20T03:18:05.233 回答