2013-09-04 17 views
6

Ich mache eine Live-Suche auf ember.js. Dies ist der CodeRichtiger Weg zum Übergang ToRoute

App.Router.map -> 
    @resource "index", {path : "/"} 
    @resource "index", {path : "/:query"} 

App.Torrents = 
    findByQuery : (query) -> 
     url = "/api/find/#{query}" 
     $.getJSON(url) 

App.IndexRoute = Ember.Route.extend 

    model : (params) -> 
     App.Torrents.findByQuery(params.query) 

App.IndexController = Ember.ArrayController.extend 

    onChangeQuery : _.debounce(-> 
     query = @get("query") 
     @transitionToRoute("index", {query : query}) 
    , 500).observes("query") 

Ich habe eine Query-Eigenschaft an einen Eingang gebunden. Wenn die Eingabe geändert werden soll, möchte ich zur Route übergehen, die den neuen Abfrageparameter übergibt, aber die IndexRoute.model-Methode wird nicht aufgerufen.

+0

Welche Version von Emberjs verwendest du ??? In früheren Versionen von ember gab es eine Inkonsistenz in den Übergängen. Aber hoffentlich ist das mit dem 'Fräser Facelift' behoben worden – selvagsz

+0

Ich benutze 1.0.0 – axelhzf

+0

Ich habe zwei Betriebsmittel, weil ich versuche, den Abfrageparameter freigestellt zu machen – axelhzf

Antwort

9

Der Grund IndexRoute.model Methode wird nicht aufgerufen. ist

Für eine Route mit einem dynamischen Segment wird nur der Modell-Hook aufgerufen, wenn sie über die URL eingegeben wird. Wenn die Route über einen Übergang eingegeben wird (z. B. bei Verwendung des Links zum Handle- bers-Helfer), wird bereits ein Modellkontext bereitgestellt, und der Hook wird nicht ausgeführt. Routen ohne dynamische Segmente führen immer den Modell-Hook aus.

erklärt here.

So wie in this issue diskutiert, verwenden Sie den setupController Hook, um Ihr Modell in diesen Fällen zu holen.

Arbeiten bin des Codes, mit setupController

+0

Schön, dass mein Problem zu lösen, danke – axelhzf

+3

Beachten Sie, dass, wenn Sie eine Zeichenfolge als das dynamische Segment an 'TransitionTo/transitionToRoute' übergeben, dann wird der Modell-Hook getroffen. Übergeben Sie ein Objekt und es wird übersprungen, aber 'beforeModel' und' afterModel' werden immer noch getroffen. – knownasilya

+0

Ehrlich gesagt, das Zitat zur Verfügung gestellt hat mich immer verwirrt. Es klingt immer so: "Der Model-Hook wird nur einmal auf dynamischen Routen aufgerufen, aber der Model-Hook wird jedes Mal auf dynamischen Routen aufgerufen" macht keinen Sinn ... Ich habe die Bedeutung inzwischen verstanden, aber es liest sich immer noch wirklich verwirrend . – Preexo

2

Sorry, ich bin spät dran, und dies ist vielleicht nicht für Sie von Nutzen sein. Ich wollte es nur hier veröffentlichen, falls es für andere von Nutzen sein könnte.

Dieser Link hat mir geholfen, mein Problem zu lösen.

Ansatz 1: Wir könnten ein Modell für die Route liefern. Das Modell wird in die URL serialisiert werden, um den serialize Haken der Route mit:

var model = self.store.find('campaign', { fb_id: fb_id }); 
self.transitionToRoute('campaign', model); 

Dies wird für das Routing gut funktionieren, aber die URL könnte manipuliert werden. In diesem Fall müssen wir zusätzliche Logik hinzufügen, um das an die neue Route übergebene Objekt zu serialisieren und die URL zu korrigieren.

Ansatz 2: Wenn ein Literal übergeben wird (z. B. eine Zahl oder eine Zeichenfolge), wird es stattdessen als Bezeichner behandelt. In diesem Fall wird das Modell Haken der Route ausgelöst werden:

self.transitionToRoute('campaign', fb_id); 

Das das Modell aufrufen würde() und würde die erforderliche URL-Routing korrekt angezeigt. setupController() wird unmittelbar nach dem model() aufgerufen.

2. funktionierte gut für mich in Ordnung. Ich hoffe, es ist nützlich und beantwortet die obige Frage.

Verwandte Themen