2014-06-14 10 views
10

Gibt es eine Möglichkeit, die data Option auf Verlängerung bei der Verwendung von IronRouter und die RouteController, Es scheint, wie es außer Kraft gesetzt wird, wenn ich von einem Super-Controller erben, wird das Kind Controller erstreckt sich nicht den definierten data Eigenschaften. Ich habe auf einer Strecke mit der yieldTemplates Option similiar Probleme hatte und verwendet eine Abhilfe (unterstreichen _extends), aber es nicht in diesem Fall nicht funktioniert:IronRouter erstreckt Datenoption auf Wegcontroller

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

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

EDIT:

Nach der Verwendung von underscore und die extend Funktion die Prototypfunktion zu erben, bin ich immer noch nicht in route Definition erben, die die 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

Können Sie erklären, warum Sie dies tun wollen und was Sie erreichen möchten? Vielleicht gibt es einen anderen Weg? –

+0

Sie müssen auch den übergeordneten (Super-) Controller aus den Daten von child() aufrufen. – LSerni

Antwort

8

ich etwas ähnliches wie dies in einer Produktions App:

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__ Mit scheint, den Trick zu tun!
Sie können als verwenden _.extend die Daten zu erweitern (http://underscorejs.org/#extend)

+0

Kann dies ohne Erweiterung Controller gemacht werden? durch direkt auf '' 'this.route''' Definition? – Kostanos

1

ich _.extends arbeiten sollte denken verwenden auch in diesem Fall:

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

Ist es "extends" oder "extend", habe ich beides versucht, konnte aber immer noch keine Daten vom 'ChildController' verwenden. Wenn ich die 'data' Definition aus dem' ApplicationController' entferne funktioniert es – Warz

+1

Das hat nicht funktioniert, keine anderen Ideen. Immer noch dieses Problem – Warz

3

auf die gewählte Antwort hinzuzufügen, beachten Sie, dass, wenn Sie Coffeescript verwenden die folgenden das gleiche Ergebnis ergeben:

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

Wirklich weiß nicht, warum Leute 4 u. Einfach eine tolle Lösung. Danke vielmals! – haotang

0

Eine weitere Option, die dasselbe Ergebnis erzielen kann, besteht darin, eine Methode auf dem übergeordneten Controller zu definieren und sie dann unter Verwendung von super aufzurufen, ohne etwas zu erweitern. Es ist etwas mehr Arbeit für jeden Controller, aber es ist einfacher, rückwirkend anzuwenden. Außerdem wird die Methode für Ihren untergeordneten Controller optional und nicht standardmäßig aktiviert.

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

Denken Sie daran, dass Sie auch auf die veröffentlichte Sammlung zu abonnieren, und ich glaube, dass Sie die WaitOn Array Option verwenden müssen, damit es die U-Boote richtig fusionieren (zugegebenermaßen immer ich ein Array-Format, so YMMV verwenden) . Sie können auf die Daten in Ihrer Vorlage zugreifen, indem Sie {{#mit Profil}} ... {{/ with}} verwenden oder wenn Sie ein Array von Objekten zurückgewinnen, verwenden Sie {{# jedes Profil}} ... {{/ jedes }}.

Verwandte Themen