我已經看到了一些關於如何做到這一點的方法,但我永遠無法弄清楚哪一種方法是「正確的」。引導一個主幹應用程序
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是未定義的。一定在這裏做錯了什麼?
我不認爲require.js和Rails方法是兼容的。 Require.js想要用'define'調用中明確列出的依賴來處理事情,這大部分否定了對'window.App'的需求。 Rails的方式是通過資產管道把所有東西都放在一個大堆裏,所以全局的'window.App'是必要的,以避免混亂。 AFAIK,你必須將'window.App'傳遞給'define'函數,就像你必須通過'Backbone'一樣。我不是一個要求。儘管如此,我可能會失去一些明顯的東西。 – 2013-02-24 17:21:15
謝謝。我仍然在學習使用Require.js,所以你說的話可能是正確的。我希望有人能夠解決這個問題。 – cabaret 2013-02-24 17:31:02
不要相信我太多,但希望有些require.js人會一起澄清事情。順便說一句,'App.Views.LoginView = Backbone.View.extend({});'和'類App.Views.LoginView擴展Backbone.View'在功能上是等價的。 – 2013-02-24 17:34:03