2010-12-29 6 views
0

Ich möchte Klickaktion auf einem Anzeigefeld in Extjs durchführen. Dabei spielt es keine Klick Zuhörer haben, so dass ich <a></a> Tags in seiner html wie folgt hinzugefügt:kann Objekt nicht dynamisch in Funktion übergeben in extjs/javascript

obj = {a: 123, b: 'abc' } 

html: '<a href="javascript: Ext.ux.classobj.method('+obj+')" ><img src="image.png" /></a>' 



Das Problem ist, ich nicht Objekt dynamisch passieren kann. Bedeutet, dass die oben <a></a> nicht die Methode nicht aufruft und feuert einen Fehler, da es nennt:

javascript: Ext.ux.classobj.method(object Object) 



Wenn jedoch i statische Werte verwenden wie

html: '<a href="javascript: Ext.ux.classobj.method({a:123, b:'abc'})" ><img src="image.png" /></a>' 

Diese Methode ohne aufgerufen wird Fehler, wie sie ruft:

javascript: Ext.ux.classobj.method({a:123, b:'abc'}) 


Does weiß jemand, wie man das macht? Vielen Dank für die Hilfe

Grüße

+0

Klingen wie ein Umfang Problem. Ihr Code, der "obj" und eine "html" -Eigenschaft definiert, scheint aus verschiedenen Teilen des Codes zu stammen ... es wäre nützlich, den Kontext dieser Zeilen zu sehen. – typeof

+0

@typeof: Es ist kein Scope-Problem. Wann immer Sie ein Objekt mit einem String verketten, ist der Standard-String-Wert für ein Objekt '[Objekt Objekt]' –

+0

Ah ja ... konnte die Gesamtstruktur für die Bäume nicht sehen. – typeof

Antwort

0

Ihre HTML-Zuordnung ändern zu:

Mit Ext.util.JSON.encode:

html: '<a href="javascript: Ext.ux.classobj.method(' + Ext.util.JSON.encode 
(obj) + ')" ><img src="image.png" /></a>' 

Mit JSON.stringify:

html: '<a href="javascript: Ext.ux.classobj.method(' + JSON.stringify(obj) + ')" ><img src="image.png" /></a>' 
+0

** Wenn ** sie eine JSON-Bibliothek haben, ja. –

+0

Agreed.Updated der Beitrag mit einer Option mit Extjs native Funktion zu stringify – Chandu

+0

Gibt immer noch keinen Verweis auf das Objekt, nur eine JSON-Darstellung des Objekts zum Zeitpunkt encode aufgerufen wurde. Natürlich ist das eine gute Antwort, wenn das gewollt ist ... schwer vorstellbar, aber möglich. – Hemlock

0

Wenn obj global ist, müssen Sie schreiben:

<a href="javascript: Ext.ux.classobj.method(obj)" ><img src="image.png" /></a> 

Wenn Sie String-Verkettung zu machen, dann werden Sie den String-Wert des Objekts erhalten standardmäßig die [object Object] ist.

+0

Was ändert sich obj, wenn der Benutzer auf den Anker klickt? – Chandu

+0

@Cybernate: Was meinst du? 'obj' hat den Wert, den es beim Anklicken der Schaltfläche hat. –

+0

Ich glaube, er macht sich Sorgen darüber, dass sich "obj" zwischen dem Zeitpunkt, als er es definiert hat, und dem Klick auf die Schaltfläche geändert hat. –

1

Der Standardwert toString eines Objekts gibt nur "[Objekt Objekt]" zurück, was (wie Sie herausgefunden haben) nicht das ist, was Sie wollen.

Ich würde zurücktreten und fragen, wenn Sie ein Framework wie ExtJS verwenden, die ziemlich reichhaltige Funktionalität bietet, warum fallen Sie zurück auf das onclick Attribut auf einem Anker? ExtJS (wie die meisten anderen JavaScript-Bibliotheken) bietet eine Möglichkeit, ein Ereignis auf einem Objekt auf eine modernere Weise zu verknüpfen, so dass Sie obj direkt verwenden können.

Ich habe ExtJS seit Jahren nicht mehr benutzt, daher habe ich Angst, dass ich mich nicht an den direkten Weg erinnern kann, aber ich denke, es ist entweder EventManager.addListener oder eher eine Abkürzung dafür wie Element#on. Sie würden also Ihren Anker (oder Bereich oder was auch immer) hinzufügen und dann addListener verwenden, um einen click Event-Handler hinzuzufügen, der obj direkt verwendet. Etwas wie:

var obj = {a: 123, b: 'abc' }; 
Ext.get('theId').on('click', function() { 
    Ext.ux.classobj.method(obj); 
}); 

... oder natürlich einfach:

Ext.get('theId').on('click', function() { 
    Ext.ux.classobj.method({a: 123, b: 'abc' }); 
}); 

... aber auch hier mein ExtJS-fu ist in diesen Tagen sehr schwach.

0

ich tun würde, so etwas wie:

var obj = { /* ... */ }; 

// ... 
{ 
    xtype: 'displayfield', 
    html: '<img src="image.png" />', // notice no <a> needed 
    listeners: { 
    render: function() { 
     this.el.on('click', function() { 
     Ext.ux.classobj.method(obj); 
     }); 
    } 
    } 
} 

Grundsätzlich warten, bis die DisplayField zu machen und dann das Klicken Zuhörer auf die el fügen Sie die Komponente sichern. Solange obj über closure erreichbar ist, geht es dir gut.

Sie könnten auch createDelegate verwenden obj als einziges Argument zu binden, für die Event-Handler:

this.el.on('click', 
    Ext.ux.classobj.method.createDelegate(Ext.ux.classobj, [obj])); 
Verwandte Themen