2013-02-24 6 views
5

私はこれを行う方法についていくつかの方法を見てきましたが、どちらが正しい方法であるか決して決めることはできません。バックボーンアプリケーションのブートストラップ

Jeffrey Way from NetTuts+およびAddy Osmaniは、アプリケーションを開始するために「メイン」アプリケーションビューをインスタンス化します。

require(['views/app'], function(AppView) { 
    new AppView(); 
}); 

Ryan Bates from Railscastsは、その後のリクエストを処理するルータをインスタンス化することにより、自分のアプリケーションを起動します:

window.App = 
    Models: {} 
    Collections: {} 
    Views: {} 
    Routers: {} 

    init: -> 
     new App.Router() 
     Backbone.history.start() 
    } 
} 

$(document).ready -> 
    App.init() 

は、アプリケーションをブートストラップのこれら二つの方法の間の重要な違いはありますか?

Ryan Batesが彼のモデル、ビューをすべて添付するAppオブジェクトを作成するのはかなり好きです...しかし、彼はCoffeeScriptを使用しますが、このオブジェクトがどのように処理されるかに違いがあるかどうかはわかりません。私はこれを試してみましたが、私はそれがRequireJSで動作させることができなかった:

define(['backbone', 'loginView'], function(Backbone, LoginView) { 
    var Router = Backbone.Router.extend({ 

    routes: { 
     '': 'index' 
    }, 

    index: function() { 
     var loginView = new LoginView(); 
    } 

    }); 

    return Router; 
}); 

そして、私のloginView:

require(['jquery', 'backbone', 'router'], function ($, Backbone, Router) { 
    window.App = { 
     Models: {}, 
     Collections: {}, 
     Views: {}, 
     Aggregator: _.extend({}, Backbone.Events), 
     Hook: $('#application'), 
     Router: Router, 

     init: function() { 
      new App.Router(); 
      Backbone.history.start(); 
     } 
    } 
    $(document)ready(function() { 
     App.init(); 
    }); 
}); 

は、私は、インデックスのルートがヒットしますloginViewを作成する簡単なルータを持っています。

define(['backbone'], function(Backbone) { 
    var LoginView = Backbone.View.extend({ 

    }); 



    return LoginView; 
}); 

作業のライアン・ベイツ道をたどるために、私のような何かをやってみたかったです0

が、私は、これは彼がのCoffeeScriptで何をするかとどのように異なるかをかなりよく分からない:

class App.Views.LoginView extends Backbone.View 

私はLoginViewのinitialize方法でコンソールに「アプリケーション」をログに記録、私は私のメインのオブジェクトを取得.jsファイル、App.Viewsオブジェクトに何かを添付しようとすると、App.Viewsが定義されていないと表示されます。ここで何か間違っているのでしょうか?

+3

を持っている私はrequire.jsを考えていないとRailsのアプローチは互換性があります。 Require.jsは、 'define'呼び出しに明示的にリストされた依存関係を使って処理することを望んでいます。これは、ほとんどが' window.App'の必要性を否定します。 Railsの方法は、アセットパイプラインを介してすべてのものを1つの大きなファイルにスローすることです。大規模な混乱を避けるためには、グローバルな 'window.App'が必要です。 AFAIK、あなたは 'backbone'を渡す必要があるように' window.App'を 'define'関数に渡す必要があります。私は必要ではない。しかし、私は何かが明らかに欠けている可能性があります。 –

+0

ありがとうございます。私はまだRequire.jsを使用することを学んでいるので、あなたの言うことは正しいかもしれません。私は、誰かが問題を明らかにしてくれることを願っています。 – cabaret

+0

あまりにも私を信用しないでください、うまくいけばいくつかのrequire.js人々は物事を明確にするために一緒になります。 BTW、 'App.Views.LoginView = Backbone.View.extend({});および' App.Views.LoginView extends Backbone.View'は機能的に同等です。 –

答えて

0

あなたが作成しているときは:あなたはcoffee to jsからそれを変換することにより、CoffeeScriptのを確認することができます

class App.Views.LoginView extends Backbone.View 

App.Views.LoginView = Backbone.View.extend({}); 

をそれはかなり異なっです

var __hasProp = {}.hasOwnProperty, 
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; 

App.Views.LoginView = (function(_super) { 

    __extends(LoginView, _super); 

    function LoginView() { 
    return LoginView.__super__.constructor.apply(this, arguments); 
    } 

return LoginView; 

})(Backbone.View); 

私は思いますtodomvc's backbone-require setupのレポをチェックすることをおすすめします。

私は窓などに付着していないグローバルAppオブジェクトの両方に緩く基づいて、CoffeeScriptのtodo setupが、コレクションを保持するために、サブオブジェクトを使用して、モデル、ビュー

関連する問題