2012-08-09 10 views
7

Ich habe eine Ansicht, die erweiterbaren/reduzierbaren Inhalt hat, den ich in der Lage sein möchte, um zu schalten, indem ich auf die Zeile in der Tabelle klicke. Vor pre1.0 hatte ich dies in der Vorlage:handling action in view nicht router

<tr {{action "expand"}}> 

, die vorher auf meiner Sicht behandelt wurde:

App.ContentRowView = Em.View.extend({ 
    templateName: 'ember/templates/content/row', 
    expand: function() { 
     this.set('isExpanded', !this.get('isExpanded')); 
    }, 
    isExpanded: false 
}); 

jedoch nach der Aktualisierung der Aktion pre1.0 nun direkt durch die ins Feld wird Router. Dies ist in vielen Situationen sinnvoll, aber in diesem Fall ist die Erweiterung wirklich ein Problem. Ich habe versucht, dies nur durch einen Click-Event-Handler ohne Glück zu ersetzen.

Gibt es eine Best Practice für die Behandlung eines View-Concern-Ereignisses wie dieses mit pre1.0?

Antwort

20

Veraltete Antwort


Auch wenn die Antwort @ outside2344 funktioniert, ich denke es stimmt nicht genau. Tatsächlich repräsentiert parentView nicht die Ansicht, sondern die parentView ihrer parentView. Seit 1.0-pre behalten Sichten ihren Kontext bei, also steht in der Vorlage this für die parentView, parentView für parentView.parentView und view für die aktuelle Ansicht. Hier ist eine Geige verdeutlichen dies: http://jsfiddle.net/Sly7/cnmJa/

Für mich ist die Antwort {{action expand target="view"}}

EDIT (Beantwortung von Ben-Haim @Gal)

Aktion Helfer verhalten sich etwas anders in einem Router-basierten Anwendung. Zitat aus der Dokumentation:

In Router-getriebene Anwendungen, wenn eine Aktion durch einen Blick nicht abgefangen wird, dass Ereignis Blase bis zur Strecke, in dem diese Ansicht wurde gemacht. Wenn es sich bei der Route um eine Unterroute einer anderen Route handelt, wird dort der Übergang bis zur obersten Routen-Definition, unserem Über-Container: root, gesucht.

Dieser Blubbeleffekt ermöglicht es bestimmten Aktionen, privat zu bleiben. Wenn bestimmte Übergänge nur für bestimmte Unterunterzustände verfügbar sein sollen, setzen Sie den Übergang auf den Unterzustand und Sie haben eine Art von Scoping erreicht.

Grundsätzlich ist für mich in Router gesteuerte Anwendungen bedeutet wenn Sie nicht explizit ein Ziel in der Action Helfer definieren, wird es an den Router gesendet.


aktualisiert Antwort

Ich denke, jetzt die Führungen beantworten sehr gut auf diese Frage.siehe http://emberjs.com/guides/templates/actions/#toc_specifying-a-target

+0

der Router docs http://emberjs.com/guides/router_primer/#toc_navigation deutlich sprechen über Ereignisse von Sichten und eine blubbernde Wirkung bis zum Router behandelt werden. Ich verstehe nicht, warum das nicht funktioniert und alles geht direkt an den Router, oder sind die Dokumente falsch/veraltet? –

+0

Ich habe meine Antwort mit dem Dokument bearbeitet. –

+1

Sehr gut beantwortet, das ist ein Punkt der Verwirrung ... – hagope

1

In pre1.0 Sie das Sichtfeld auf die Aktion die Aktion durch Zugabe von Ziel machen = "parentView":

{{action "expand" target="parentView"}} 
+1

Sie könnten auch das Ziel wickeln auf ein einzelnes Objekt/Ansicht (wenn Sie mehrere Aktionen und/oder Bindungen haben) unter Verwendung eines ' {{mit}} Aussage. – SciSpear

1

Ereignisse blubbern nicht standardmäßig durch die View-Hierarchie. Sie können dies ändern (obwohl ich nicht sagen kann ich es empfehlen würde):

(function() { 
    Ember.View.reopen({ 
     // Let actions bubble to parentView by default. 
     target: function() { 
      return this.get('parentView'); 
     }.property('parentView') 
    }); 
})();