2014-06-14 4 views
10

वहाँ data विकल्प है जब IronRouter और RouteController का उपयोग कर विस्तार करने के लिए एक रास्ता है, ऐसा लगता है जैसे कि यह अधिरोहित हो जाता है जब मैं एक सुपर नियंत्रक से विरासत, बच्चे नियंत्रक परिभाषित data विस्तार नहीं करता है गुण। मैं एक मार्ग पर yieldTemplates विकल्प के साथ समान मुद्दों था और एक समाधान (_extends को रेखांकित) का इस्तेमाल किया, लेकिन यह इस मामले में काम नहीं किया है:IronRouter विस्तार डेटा विकल्प

ApplicationController = RouteController.extend({ 
    data: function(){ 
      return { 
       user: Meteor.user() 
     }  
    } 
}); 

ChildController = ApplicationController.extend({ 
    data: function(){ 
     return { 
       // I expect to inherit Meteor.User ????? 
       someData: {} 
     } 
    } 
}); 

संपादित करें:

underscore और extend समारोह इस्तेमाल करने के बाद प्रोटोटाइप समारोह वारिस के, मैं अभी भी route परिभाषा के कि ChildController

this.route('someRoute', { 
    template: 'task_template', 
    //tasks is not available on the template 
    data: function() { 
      var base = ChildController.data.call(this); 
      console.log(base); 
      return _.extend(base, { 
       tasks: Tasks.find({state: 'Open'}) 
      }); 
}); 
+0

क्या आप समझा सकते हैं कि आप ऐसा क्यों करना चाहते हैं और आप क्या हासिल करने की कोशिश कर रहे हैं? शायद एक और तरीका है? –

+0

आपको बच्चे के डेटा() से पैरेंट (सुपर) नियंत्रक को भी आमंत्रित करने की आवश्यकता है। – LSerni

उत्तर

8

मैं एक उत्पादन अनुप्रयोग में यह करने के लिए कुछ इसी तरह का उपयोग करें:

Router.route('/test/:testparam', { 
    name: 'test', 
    controller: 'ChildController' 
}); 

ParentController = RouteController.extend({ 
    data: function() { 
     console.log('child params: ', this.params); 
     return { 
      foo: 'bar' 
     }; 
    } 
}); 

ChildController = ParentController.extend({ 
    data: function() { 
     var data = ChildController.__super__.data.call(this); 
     console.log(data); 
     return data; 
    } 
}); 

__super__ का उपयोग चाल करने के लिए लगता है!

class @ChildController extends ParentController 
    data: -> super() 
    # or if you want to add to it: 
    data: -> 
    _.extend super(), { extraThing: 'some value' } 
+0

क्या यह नियंत्रक को विस्तार किए बिना किया जा सकता है? '' 'this.route''' परिभाषा पर सीधे उपयोग करके? – Kostanos

1

मुझे लगता है कि _.extends में काम करना चाहिए का उपयोग में वारिस करने में असमर्थ हूँ साथ ही इस मामले:

ChildController = ApplicationController.extend({ 
    data: function() { 
    var base = ApplicationController.data.call(this); 
    return _.extends(base, { 
     someData: {}, 
    }); 
    } 
}); 
+0

क्या यह 'विस्तार' या 'विस्तार' है, मैंने दोनों को आजमाया लेकिन अभी भी 'चाइल्डकंट्रोलर' से डेटा का उपयोग करने में असमर्थ रहा। यदि मैं 'ApplicationController' से 'डेटा' परिभाषा को हटा देता हूं तो यह – Warz

+1

काम करता है यह किसी भी अन्य विचारों पर काम नहीं करता है। अभी भी यह समस्या – Warz

3

चयनित जवाब में जोड़ने के लिए विस्तार ध्यान दें कि यदि आप Coffeescript उपयोग कर रहे हैं निम्नलिखित समान ही परिणाम मिलेगा करने के लिए उपयोग कर सकते हैं _.extend एक और विकल्प जो एक ही परिणाम प्राप्त कर सकता है वह है अपने माता-पिता नियंत्रक पर एक विधि को परिभाषित करना, फिर इसे किसी भी विस्तार के बिना सुपर का उपयोग करके कॉल करें। यह प्रत्येक नियंत्रक के लिए थोड़ा और काम है लेकिन पीछे हटाना आसान है। इसके अलावा यह डिफ़ॉल्ट रूप से आपके बच्चे नियंत्रक के लिए विधि वैकल्पिक बनाता है।

ApplicationController = RouteController.extend({ 
     waitOn: function() { 
      return [Meteor.subscribe('customUserPublish')]; 
     }, 
     GetProfileWithEmail: function(){ 
      var user = Meteor.user(); 
      var profile = user.profile; 
      profile.email = user.emails[0].address; 
      return profile; 
     } 
    }); 

ProfileController = ApplicationController.extend({ 
     waitOn: function() { 
      return [Meteor.subscribe('anotherCollectionPublish')]; 
     }, 
     data: function(){ 
      return { 
      profile: function(){ 
       var profile = ApplicationController.__super__.GetProfileWithEmail.call(this); 
       console.log('profile from super', profile); 
       return profile; 
      } 
      } 
     } 
}); 

याद रखें कि आप के रूप में अच्छी प्रकाशित संग्रह की सदस्यता के लिए है और मुझे विश्वास है कि आप waitOn सरणी विकल्प का उपयोग करने इतना है कि यह बाद के चरणों ठीक से मर्ज हो जाएगा की जरूरत है (वैसे मैं हमेशा YMMV एक सरणी प्रारूप का उपयोग करें) । आप {{#with profile}} ... {{/ with}} का उपयोग करके अपने टेम्पलेट में डेटा तक पहुंच सकते हैं या यदि आप ऑब्जेक्ट्स की एक सरणी वापस प्राप्त कर रहे थे {{#each profile}} ... {{/ प्रत्येक }}।

+2

वास्तव में नहीं जानते कि लोगों ने आपको 4 वोट क्यों नहीं दिए। बस एक अद्भुत समाधान। आपका बहुत बहुत धन्यवाद! – haotang

संबंधित मुद्दे