2013-06-21 22 views
15

Tôi muốn sử dụng this.get('controllers.pack.query'); để nhận App.PackQueryController trong App.PackController, nhưng không thành công.Ember.js Cách nhận bộ điều khiển theo nhu cầu mà được lồng vào controllerName

Tôi nghĩ vấn đề là Ember sử dụng pack không pack.querycontrollerName khi cố gắng lấy bộ điều khiển. Mặc dù tôi có thể nhận được điều khiển bởi this.controllerFor('pack.query'), nhưng Ember nói nó bị phản đối, hãy sử dụng needs thay

Bản đồ của tôi Router thích dưới đây và tôi đã xác định needs: ['pack.query'] trong App.PackController

App.Router.map(function() { 
    this.resource('pack', function() { 
     this.route('index', {path: '/:pack_id'}) 
     this.route('query'); 
    }); 
}); 

App.PackController = Ember.ObjectController.extend({ 
    needs: ['pack.query'], 
    queryPack: function() { 
     var packQueryCtrller = this.get('controllers.pack.query');    

     Ember.debug('packQueryCtrller: ' + packQueryCtrller); 
     //DEBUG: packQueryCtrller: undefined 

     packQueryCtrller.queryPack(); //faild packQuery is undefined 
    } 
}); 

App.PackQueryController = Ember.ArrayController.extend({ 
    queryPack: function (queryKey) { 
     //...do query pack 
    } 
}); 

Trả lời

16

Bạn nên sử dụng lạc đà trường hợp, không ký hiệu chấm cho điều này.

điều khiển gói của bạn nên được

App.PackController = Ember.ObjectController.extend({ 
    needs: ['packQuery'], 
    queryPack: function() { 
    var packQueryCtrller = this.get('controllers.packQuery');    

    Ember.debug('packQueryCtrller: ' + packQueryCtrller); 
    //DEBUG: packQueryCtrller: undefined 

    packQueryCtrller.queryPack(); //faild packQuery is undefined 
    } 
}); 
+1

này không không làm việc bài ember-cli 0.2.3. Xem câu trả lời của @rog cho một giải pháp làm việc. –

35

Ember.inject.controller() nên được sử dụng để truy cập vào một bộ điều khiển. Sử dụng nó như vậy:

Thiết

... 
myController: Ember.inject.controller('pack'), 
nestedController: Ember.inject.controller('pack/query') 
... 

Bắt

... 
this.get('myController'); 
this.get('nestedController'); 
... 

Câu trả lời trên đã được cập nhật để phản ánh needsdeprecation trong Ember 1.13.5 (phát hành ngày 19 Tháng 7 2015). Tôi đã để lại các câu trả lời cũ dưới đây, nhưng không nên được sử dụng trừ khi bạn đang sử dụng một phiên bản cũ của Ember.


[PHẢN ĐỐI] Truy cập vào bộ điều khiển lồng nhau từ các bộ điều khiển khác sử dụng needs:

Set needs trên bộ điều khiển:

... 
needs: ['pack/query'], 
... 

Sau đó truy cập nó bằng cách sử:

this.get('controllers.pack/query'); 

[NỮA] Truy cập vào bộ điều khiển lồng nhau từ các tuyến đường:

Lý tưởng nhất, actions nên được đặt trên một lộ. Nếu bạn đang sử dụng mẫu needs được nêu ở trên trong số actions trên bộ điều khiển, hãy xem xét sắp xếp lại.

Bạn có thể truy cập vào bộ điều khiển lồng nhau từ một Route sử dụng controllerFor như vậy:

this.controllerFor('pack/query') 
+0

Được cập nhật lần nữa để phản ánh các phiên bản mới (Ember 1.11.1 và ember-cli 0.2.3) – rog

+0

Cảm ơn bạn vì điều này, có rất ít thông tin đáng ngạc nhiên về chủ đề này và dường như có vấn đề vấp ngã một cách mù quáng tối. –

+0

Được cập nhật một lần nữa để phản ánh phiên bản mới hơn (Ember 1.13.5) đã giới thiệu một sự phản đối của câu trả lời gốc. – rog

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