2014-06-14 11 views
10

Czy istnieje sposób przedłużenia opcji data podczas korzystania z aplikacji IronRouter i RouteController. Wydaje się, że zostanie ona zastąpiona, gdy dziedziczę z kontrolera nadrzędnego, kontroler podrzędny nie rozszerza zdefiniowanego data nieruchomości. Miałem problemy podobne z opcją yieldTemplates na trasie i używane obejście (podkreślenie _extends), ale to nie działa w tym przypadku:Opcja przedłużenia danych IronRouter na kontrolerze trasy

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

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

EDIT:

Po użyciu underscore i funkcję extend dziedziczyć funkcję prototypu, wciąż jestem w stanie odziedziczyć w route definicja, że ​​używać 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

Czy możesz wyjaśnić, dlaczego chcesz to zrobić i co chcesz osiągnąć? Może jest inny sposób? –

+0

Należy również wywołać kontroler nadrzędny (super) z danych dziecka(). – LSerni

Odpowiedz

8

Używam coś podobnego do tego w app produkcji:

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

Korzystanie __super__ wydaje rade!
Można niż używać _.extend rozszerzyć dane (http://underscorejs.org/#extend)

+0

Czy można to zrobić bez rozszerzania kontrolera? używając bezpośrednio definicji '' 'this.route'''? – Kostanos

1

myślę _.extends powinien pracować w Ta sprawa także:

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

Czy to 'extends' lub' extend', próbowałem obu, ale nadal nie można używać danych z 'ChildController'. Jeśli usunę definicję 'data' z' ApplicationController' działa – Warz

+1

To nie działa, żadnych innych pomysłów. Nadal masz ten problem – Warz

3

dodać do wybranej odpowiedzi należy pamiętać, że jeśli używasz coffeescript dodaje przyniesie ten sam wynik:

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

Naprawdę nie wiem, dlaczego ludzie nie głosowali 4 u. Po prostu niesamowite rozwiązanie. Wielkie dzięki! – haotang

0

Inną opcją, która może osiągnąć ten sam wynik, jest zdefiniowanie metody na kontrolerze nadrzędnym, a następnie wywołanie jej przy użyciu super bez rozszerzania czegokolwiek. To nieco więcej pracy dla każdego kontrolera, ale łatwiej jest zastosować je z mocą wsteczną. Ponadto domyślnie metoda ta jest opcjonalna dla kontrolera podrzędnego.

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

Pamiętaj, że musisz zapisać się do opublikowanej kolekcji, jak również i wierzę, że trzeba użyć opcji waitOn tablicy tak, że będzie scalić subs prawidłowo (co prawda zawsze używać formatu tablicy, tak YMMV) . Możesz uzyskać dostęp do danych w swoim szablonie za pomocą {{z #profilu}} ... {{/ with}} lub jeśli otrzymujesz z powrotem tablicę obiektów, użyj {{#each profile}} ... {{/ each }}.

Powiązane problemy