2013-02-24 64 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工作:

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', 'loginView'], function(Backbone, LoginView) { 
    var Router = Backbone.Router.extend({ 

    routes: { 
     '': 'index' 
    }, 

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

    }); 

    return Router; 
}); 

而且我loginView:

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

    }); 



    return LoginView; 
}); 

要遵循工作的Ryan Bates的方式,我想這樣做:

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

,但我不能肯定這是如何不同於他的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的方式是通過資產管道把所有東西都放在一個大堆裏,所以全局的'window.App'是必要的,以避免混亂。 AFAIK,你必須將'window.App'傳遞給'define'函數,就像你必須通過'Backbone'一樣。我不是一個要求。儘管如此,我可能會失去一些明顯的東西。 – 2013-02-24 17:21:15

+0

謝謝。我仍然在學習使用Require.js,所以你說的話可能是正確的。我希望有人能夠解決這個問題。 – cabaret 2013-02-24 17:31:02

+0

不要相信我太多,但希望有些require.js人會一起澄清事情。順便說一句,'App.Views.LoginView = Backbone.View.extend({});'和'類App.Views.LoginView擴展Backbone.View'在功能上是等價的。 – 2013-02-24 17:34:03

回答

0

當你創建:

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

這是相當不同:

class App.Views.LoginView extends Backbone.View 

您可以將它從coffee to js檢查的CoffeeScript:

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

我有鬆散的基礎上都具有全球應用對象未連接到窗口,但使用子對象的CoffeeScript todo setup持有藏品,模型,視圖等