2013-02-24 35 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持有藏品,模型,视图等