2013-06-26 52 views
5

Tôi đang sử dụng BackboneJS với RequireJS cho một ứng dụng tôi đang xây dựng.Biến toàn cục trong bộ định tuyến BackboneJS bằng cách sử dụng RequireJS

Hồ App initialises Router:

// Define application router 
var router = new AppRouter(); 
Backbone.history.start(); 

Và sau đó Router sẽ kiểm soát các hoạt động của hệ thống.

var App = Backbone.Router.extend({ 

    routes: { 

     "project/:id": "getProject", 
     "projects": "getProjects", 
     "*actions": "defaultRoute" 
    }, 

    getProject: function (id) { 
     // dashboard.set('some_key', 'some_value'); 
    }, 

    getProjects: function() { 
     // dashboard.set('some_key', 'some_value'); 
    }, 

    defaultRoute: function() { 
     // dashboard.set('some_key', 'some_value'); 
    } 

}); 

Tôi đã thêm Dashboard mô hình và chế độ xem tôi sử dụng để hiển thị thông tin toàn cầu về trạng thái của hệ thống tại bất kỳ thời điểm đã định nào. (Điều này sẽ ngồi ở phía trên cùng của cửa sổ). Chế độ xem của nó theo dõi mô hình của nó để thay đổi giá trị và hiển thị lại khi cần thiết. Điều này hoạt động tốt.

Tôi muốn tránh phải viết lại này bao giờ sau khi ban đầu instantiation đối tượng của tôi:

var dashboard = new DashboardModel(); 
var dashboardView = new DashboardView({ model: dashboard }); 
$('#dashboard-placeholder').html(dashboardView.render().el); 

Những gì tôi cần, mặc dù là để có thể tiếp cận đối tượng này bất cứ nơi nào (một thể hiện của Dashboard của tôi mô hình). Tại thời điểm này tôi khởi tạo nó trong App nhưng tôi không thể truy cập nó trong Router nếu tôi làm điều này. Tôi không thực sự muốn định nghĩa nó trong router bởi vì điều đó không cảm thấy như nhiệm vụ phù hợp cho Router thực hiện.

Làm cách nào và nơi nào tôi xác định trường hợp này của mô hình Dashboard của tôi?

Trả lời

13

Những gì tôi cần, mặc dù là để có thể tiếp cận đối tượng này bất cứ nơi nào

gì bạn đang tìm kiếm là singleton pattern:

Ý định:

  • Đảm bảo chỉ có một thể hiện của một lớp được tạo ra.
  • Cung cấp điểm truy cập toàn cầu cho đối tượng.

Thực hiện:

  • (...) Các mẫu Singleton định nghĩa một hoạt động getInstance đó cho thấy nhiều un dụ iQue được truy cập bởi các khách hàng. getInstance() là chịu trách nhiệm tạo cá thể lớp duy nhất của nó trong trường hợp nó không phải là được tạo ra và để trả về phiên bản đó.

Và đây là cách bạn có thể thực hiện nó:

define("DashboardModel", function() { 
    var instance; 

    var DashboardModel = Backbone.Model.extend({ 
     (...) 
    }); 

    // Static method 
    DashboardModel.getInstance = function() { 
     // "instance" can be "this.instance" (static property) 
     // but it is better if it is private 
     if (!instance) { 
      instance = new DashboardModel(); 
     } 
     return instance; 
    }; 
}); 

Bây giờ mỗi khi bạn cần dụ DashboardModel bạn chỉ cần gọi:

var DashboardModel = require("DashboardModel"); //or from the define arguments 
var dashboard = DashboardModel.getInstance(); 
+0

câu trả lời Brilliant, cảm ơn bạn rất nhiều. Tôi đã có một cách tiếp cận singleton trong tâm trí nhưng vẫn không chắc chắn làm thế nào để thực hiện một phương pháp tĩnh! Làm việc tuyệt vời, cảm ơn bạn. – Alex

2

Singleton là một sự lựa chọn rõ ràng nhưng tôi nghĩ bạn cũng có thể tạo ra một thể hiện của mô hình của bạn trong một định nghĩa mô-đun mới.

define("MyX", "MyXModel", function(MyXModel){ 
    return new MyXModel(); 
}); 

Xin xem tài liệu AMDjs api https://github.com/amdjs/amdjs-api/wiki/AMD#factory-

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