2013-02-24 29 views
5

Tôi đã thấy một vài cách để làm điều này, nhưng tôi không bao giờ có thể tìm ra cách nào là 'chính xác'.Khởi động lại ứng dụng Backbone

Jeffrey Way from NetTuts+Addy Osmani khởi tạo chế độ xem ứng dụng 'chính' để khởi chạy ứng dụng của chúng.

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

Ryan Bates from Railscasts bắt đầu ứng dụng của mình bằng cách instantiating một router mà sau đó xử lý yêu cầu tiếp theo:

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

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

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

Có một sự khác biệt quan trọng giữa hai cách sau đây của bootstrapping một ứng dụng?

Tôi khá thích cách Ryan Bates tạo đối tượng App mà anh ấy gắn tất cả các mô hình, chế độ xem, ... Anh ấy sử dụng CoffeeScript, tôi không chắc liệu điều này có tạo ra sự khác biệt về cách xử lý đối tượng này không. Tôi cố gắng này và tôi không thể có được nó để làm việc với 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(); 
    }); 
}); 

sau đó tôi có một router đơn giản mà tạo ra một loginView khi các tuyến đường chỉ được nhấn:

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

    routes: { 
     '': 'index' 
    }, 

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

    }); 

    return Router; 
}); 

Và loginView của tôi:

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

    }); 



    return LoginView; 
}); 

để thực hiện theo cách làm việc Ryan Bates', tôi muốn làm một cái gì đó như:

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

nhưng tôi không hoàn toàn chắc chắn cách này khác với những gì anh ấy làm trong coffeescript:

class App.Views.LoginView extends Backbone.View 

Khi tôi đăng nhập 'App' ra cửa sổ Console trong phương pháp LoginView tôi initialize, tôi nhận được đối tượng từ chính của tôi Tệp .js, tuy nhiên, khi tôi cố gắng đính kèm một thứ gì đó vào đối tượng App.Views, nó cho biết App.Views là không xác định. Phải làm điều gì sai ở đây?

+3

Tôi không nghĩ rằng require.js và Các cách tiếp cận Rails tương thích. Require.js muốn xử lý mọi thứ theo cách của nó với các phụ thuộc được liệt kê rõ ràng trong các lệnh 'define', điều này phần lớn phủ nhận sự cần thiết của' window.App'. Cách Rails là để ném tất cả mọi thứ trong một đống lớn thông qua các đường ống tài sản để một cửa sổ 'global.App' toàn cầu là cần thiết để tránh một mớ hỗn độn lớn. AFAIK, bạn phải chuyển 'window.App' sang các hàm' define' giống như bạn phải truyền chúng 'Backbone'. Tôi không phải là một yêu cầu.js guy mặc dù vậy tôi có thể thiếu một cái gì đó hiển nhiên. –

+0

Cảm ơn bạn. Tôi vẫn đang học cách sử dụng Require.js để những gì bạn nói có thể đúng. Tôi hy vọng một người nào đó sẽ có thể làm sáng tỏ vấn đề. – cabaret

+0

Đừng tin tôi quá xa, hy vọng một số người require.js sẽ cùng làm rõ mọi thứ. BTW, 'App.Views.LoginView = Backbone.View.extend ({});' và 'lớp App.Views.LoginView mở rộng Backbone.View' có chức năng tương đương. –

Trả lời

0

Khi bạn đang tạo:

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

Đó là khá khác nhau từ:

class App.Views.LoginView extends Backbone.View 

Bạn có thể kiểm tra coffeescript bằng cách chuyển đổi nó từ coffee to js:

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); 

tôi khuyên bạn nên kiểm tra repo cho todomvc's backbone-require setup.

Tôi có một coffeescript todo setup dựa lỏng lẻo trên cả hai với một đối tượng ứng dụng toàn cầu không gắn liền với cửa sổ, nhưng sử dụng đối tượng phụ để giữ bộ sưu tập, models, views, vv

Các vấn đề liên quan