2013-06-02 44 views
23

Tôi cần sử dụng biến toàn cục (ngữ cảnh người dùng, có sẵn từ tất cả mã) Tôi đã đọc một số bài viết về chủ đề này nhưng tôi không có câu trả lời rõ ràng.Truy cập biến toàn cục từ bất kỳ bộ điều khiển ứng dụng nào

App = Ember.Application.create({ 
    LOG_TRANSITIONS: true, 
    currentUser: null 
}); 
  1. Có một thực hành tốt để thiết lập các biến toàn cầu CurrentUser trong đối tượng App?
  2. Cách cập nhật và truy cập thuộc tính hiện tại của người dùng từ tất cả các bộ điều khiển được sử dụng trong ứng dụng?

Trả lời

58

Thực tiễn tốt là đặt biến GlobalUser hiện tại trong đối tượng ứng dụng?

Không, đây không phải là phương pháp hay. Bạn nên tránh sử dụng các biến toàn cục. Khung làm việc rất nhiều để làm cho điều này có thể - nếu bạn thấy mình nghĩ một biến toàn cầu là giải pháp tốt nhất, đó là dấu hiệu cho thấy một cái gì đó cần được tái cấu trúc. Trong hầu hết các trường hợp, đúng nơi nằm trong bộ điều khiển. Ví dụ, CurrentUser có thể là:

//a property of application controller 
App.ApplicationController = Ember.Controller.extend({ 
    currentUser: null 
}); 

//or it's own controller 
App.CurrentUserController = Ember.ObjectController.extend({}); 

Làm thế nào để cập nhật và truy cập vào các tài sản CurrentUser từ tất cả các bộ điều khiển được sử dụng trong các ứng dụng?

Sử dụng thuộc tính needs. Giả sử bạn đã khai báo currentUser là thuộc tính của ApplicationController. Nó có thể được truy cập từ PostsController như thế này:

App.PostsController = Ember.ArrayController.extend{(
    needs: ['application'], 
    currentUser: Ember.computed.alias('controllers.application.currentUser'), 
    addPost: function() { 
    console.log('Adding a post for ', this.get('currentUser.name')); 
    } 
)} 

Nếu bạn cần truy cập CurrentUser từ một cái nhìn/mẫu, chỉ cần sử dụng needs để làm cho nó truy cập thông qua bộ điều khiển cục bộ. Và nếu bạn cần nó từ một lộ trình, hãy sử dụng phương thức controllerFor của route.

+0

Tôi có ít thuộc tính boolean cấp ứng dụng và các thuộc tính đó sẽ được sử dụng trong hầu hết tất cả các khung nhìn/mẫu. Nếu tôi định nghĩa chúng trong 'applicationController' thì tôi phải định nghĩa thuộc tính' needs' trong tất cả bộ điều khiển. Nếu tôi định nghĩa chúng trong ứng dụng thì không cần 'nhu cầu'. Có suy nghĩ gì về điều này không? – Manoharan

+1

Tôi có thể thấy một đối số để thiết lập một số thuộc tính boolean ở cấp Ứng dụng, như chính định dạng ember định nghĩa LOG_TRANSITIONS. Bất cứ điều gì phức tạp hơn nên def trong bộ điều khiển riêng của nó. Nếu bạn đang ở trong một tình huống mà bạn muốn có một bộ điều khiển để có sẵn trong tất cả những người khác, bạn có thể sử dụng một initializer để tiêm nó vào những người khác. Xem http://mcdowall.info/posts/ember-application-initializers/ cho một ví dụ làm cho 'CurrentUserController' có sẵn như là thuộc tính' currentUser' của tất cả các bộ điều khiển. Có thể dễ dàng thực hiện tương tự với ConfigController. –

+1

Ember.Computed nên được Ember.computed – Nath

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