2013-05-11 4 views
14

Ich aktualisiere ein persönliches Projekt, wo ich die ember.js Version 0.9.x.Wie können wir das ursprüngliche Ereignis in der Aktion von ember bekommen

Also eine neue Version wurde veröffentlicht und ich habe ein Problem mit Glut Aktion.

Ich habe den folgenden HTML-Code:

<li><a href="#" id="startApp" {{action activateView target="view"}}> Home</a> <span class="divider">|</span></li> 

wo, wenn ich seinen Aufruf dieser Funktion activateView klicken:

activateView: function(event, context) { 
    console.log(event);    
} 

aber das Ereignis und den Kontext nicht definiert sind. Ich habe schon versucht, dies.kontext und es kommt undefined zurück.

Die Hauptidee es erhalten die ID der Verbindung, wenn der Benutzer klickt.

Ich weiß, über Routen und Lenker Helfer Link zu, aber ich brauche wirklich diese ID für andere Dinge,

Können Sie mir helfen?

Dank

Antwort

7

Das Ereignis wird nicht mit dem Aktionshelfer übergeben. Wenn Sie wirklich das Ereignisobjekt wollen, müssen Sie eine Ansicht definieren und verwenden, um die click Ereignis:

App.MyLink = Em.View.extend({ 
    click: function(e) { 
    } 
}); 

und dann:

<li>{{view App.MyLink}}</li> 

aber Zugriff auf das DOM-Ereignis erfordert, ist ein seltener Fall, weil Sie können Argumente an {{action}} übergeben. In Ihrem Fall:

<li><a href="#" id="startApp" {{action activateView "startApp" target="view"}}> Home</a> <span class="divider">|</span></li> 

und im Falle:

activateView: function(id) { 
    console.log(id);    
} 
+0

Danke, für Ihre Hilfe. Es war Stunden zu versuchen, dies zu lösen und am Ende ist die Lösung sehr einfach. –

+0

Gern geschehen, froh, dass es geklappt hat! –

+5

Zu einem Ereignis gehört mehr als nur das DOM-Element. Ich verstehe, dass es eine bessere Vorgehensweise ist, nicht auf das Ereignis in einer Aktion zuzugreifen oder meinen eigenen benutzerdefinierten Handler einzurichten, wenn dies wirklich erforderlich ist. Aber gibt es eine Hintertür, um trotzdem auf die Veranstaltung zugreifen zu können? Im Grunde hat niemand die Frage des OP tatsächlich beantwortet. –

2

müssen Sie die ID in Ihrer Funktion zu übergeben, wie so haben sie in der Ansicht zugänglich, können Sie passieren zusammen, was immer Sie wollen in Ihrem Beispiel, aber das sollte es tun

html

<li><a href="#" id="startApp" {{action activateView "startApp" target="view"}}> Home</a> <span class="divider">|</span></li> 

dann haben Sie Zugriff auf die ID oder was auch immer Sie übergeben, in der Ansicht

js

... 
activateView: function(data){ 
    console.log(data); // should be the ID "startApp" 
} 
... 
+0

Danke, für Ihre Hilfe. Es war Stunden zu versuchen, dies zu lösen und am Ende ist die Lösung sehr einfach. –

+0

Sie sind herzlich willkommen :) – intuitivepixel

11

In Ember 2 ...

In Ihrer Aktion haben Sie immer Zugriff auf das Javascript event Objekt, das das DOM-Element z

actions: { 
    myAction() { 
     console.log(event.target) // prints the DOM node reference 
    } 
} 
+0

vielen Dank dafür – agent47

+4

Für mich scheint dies in Firefox nicht zu funktionieren. Ich bekomme einen Fehler, der besagt: 'ReferenceError: Event ist nicht definiert'. Beispiel: https://jsfiddle.net/6fra6cL4/ –

+0

Wird dies irgendwo in den Ember-Dokumenten erwähnt? Ich kann es nicht finden. –

0

Es gibt zwei Möglichkeiten, wie Sie event Objekt in Aktionen empfangen können,

1. Wenn Sie Komponente verwenden, dann können Sie jede dieser Liste des Ereignisses definieren Namen in der Komponente und die entwickelt wurde, um natives Ereignisobjekt zu erhalten. z. B. {{my-button model=model}}

export default Ember.Component.extend({ 
click(event){ 
    //oncliking on this componen will trigger this function 
    return true; //to bubble this event up 
} 
}) 

2. Wenn Sie HTML-Tag wie Taste verwenden, dann müssen Sie einen (Verschluss) -Aktion an einem Inline-Event-Handler zuweisen.

{{#each item as |model|}} 
     <button onclick={{action 'toggle' model}}>{{model.title}}</button> 
{{/each}} 

In Aktionen wird Hash-Umschaltfunktion immer natives Browser-Ereignisobjekt als letztes Argument erhalten.

actions:{ 
toggle(model,event){ 

} 
} 

Im folgende Format wird Aktion Toggle erhält nicht event Objekt,

  • <button {{action 'toggle'}}>{{model.title}}</button>
  • Eingang Helfer wie {{input key-press="toggle" und {{text-area key-press="toggle"

in ember Führung wirklich gut erklärt https://guides.emberjs.com/v2.12.0/components/handling-events/#toc_sending-actions

Verwandte Themen