2013-08-22 4 views
2

Comment puis-je transmettre des valeurs externes à un contrôleur. Dans le code ci-dessous, je voudrais transmettre les valeurs filtertype et filterterm de PostsController en PostsDynamicController. Quel est le moyen d'y parvenir?Comment passer des arguments à une méthode init du contrôleur?

J'ai un modèle comme celui-ci

<script type="text/x-handlebars" id="posts">    
        {{view Ember.Select 
        contentBinding="App.names.content" 
        valueBinding="App.names.selected" 
        }} 
        {{view Ember.TextField valueBinding="filterterm" }} 
        <button {{action "submit"}} > Submit</button> 
     {{outlet}} 
    </script> 

Une partie de mon app.js est la suivante:

App.PostsController = Ember.ObjectController.extend({ 
    content: [], 
    filterterm: "", 
    submit: function() { 
     var filtertype = App.names.selected; 
     var filterterm = this.get('filterterm'); 
     this.transitionToRoute("posts.dynamicfinder"); 
    } 
}); 

App.PostsDynamicController = Ember.ObjectController.extend({ 
    init: function() { 
    //want access to filtertype and filterterm here so that I can pass them in find. i.e. 
    //App.Request.find(filtertype: filterterm); 
    this.set('model', App.Request.find(..); 
    } 
}); 

Répondre

1

Vous ne pouvez pas passer args à la fonction init() du contrôleur.

Pour transmettre des valeurs externes à un contrôleur, vous devez utiliser des liaisons. Plus précisément la propriété needs du contrôleur. Voir le guide de Ember dependencies-between-controllers

Ainsi, par exemple:

// Change handlebars template to valueBinding="filtertype" instead of valueBinding="App.names.selected" 

// Also these should be ArrayControllers not ObjectControllers 

App.PostsController = Ember.ArrayController.extend({ 
    filterterm: null, 
    filtertype: null, 
    submit: function() { 
    this.transitionToRoute("posts.dynamicfinder"); 
    } 
}); 

App.PostsDynamicController = Ember.ArrayController.extend({ 
    needs: ['posts'], 
    termBinding: 'controllers.posts.filterterm', 
    typeBinding: 'controllers.posts.filtertype', 
    filteredPosts: function() { 
    var filtertype = this.get('type'); 
    var filterterm = this.get('term'); 
    // ... 
    }.property('term', 'type') 
} 

});

+0

Si 'term' et' type' sont définis à la fin de cela, comment définir le modèle? Dans ce cas, je voudrais définir le modèle à: '.set ('model', App.Request.find (type: terme))' – Anthony

+0

J'ai un exemple de travail sur jsbin si cela aide: http: // jsbin. com/OcAyoYo/33/edit Lorsqu'une liste déroulante est modifiée et qu'une valeur de zone de texte est entrée et que l'on clique sur soumettre, je voudrais faire une demande à dynamicfinder avec le modèle 'find (terme: type)' – Anthony

+0

Je ne pense pas ' App.Request.find (type: terme) 'fonctionne comme vous le pensez. Il renvoie une collection live qui inclut chaque 'App.Request' dans le magasin. Ensuite (async), il lance une requête API avec la requête spécifiée. Tous les objets renvoyés par l'API sont ajoutés au magasin et apparaissent ainsi dans la collection live. Cela ressemble à ce que vous voulez renvoyer est une collection filtrée, de sorte que seuls les enregistrements correspondant au terme spécifié sont affichés. –

Questions connexes