Ist es möglich, den Prototyp des Javascript-Objekts auszublenden!Was ist das Rätsel dahinter?

StackOverflow https://stackoverflow.com//questions/23005462

Frage

Ich verwende Openui5.Es gibt eine Konstruktor-Funktion für die UI-Control-Schaltfläche, die die Prototyp-Eigenschaften der Taste nicht sehen kann, aber dasselbe, wenn sie in der Browserkonsole ausgeführt werden, zeigt sich auf!

generasacodicetagpre.

derselbe Code, wenn der Browser in der Konsole ausgeführt wird, funktioniert es!

jsbin -> http://jsbin.com/tepum/1/edit

War es hilfreich?

Lösung

Nachdem ich den Code ausgeführt habe, finde ich, dass das Erstellen der ersten Instanz von SAP.M.Button das Skript verursacht, um den Prototyp von SAP.M.Button zu ändern. Es ist in JavaScript gültig, aber nicht sehr smart, wenn Sie mich fragen.

Eine erste Erstellung bewirkt, dass eine synchrone Anforderung (kein Nein auch), um Bibliotheksparameter abzuholen.

Wenn Sie den Code ausführen, ist das zweite Mal, dass er prototype.move hat, da das Erstellen einer Instanz der Schaltfläche den Knopf nicht ändert.Prototype.

Die Hauptstadt M in Move würde eine Konstruktor-Funktion vorschlagen, sodass ich Ratschläge, um sie in Kleinbuchstaben zu ändern würde.

Da das Abrufen der Parameter synchron ist, können Sie die erste Instanz erstellen und dann den Prototyp einstellen:

generasacodicetagpre.

Meine Vermutung ist, dass dies an LAZY LOAD-Steuerelemente erfolgt, wenn niemals ein Knopf erstellt wird, dann werden die JSON-Konfigurationsdateien niemals für diese nicht verwendeten Steuerelemente geladen. Es hat jedoch ein paar Nachteile.

    .
  1. Sie müssen zuerst eine Instanz erstellen, bevor Sie den Prototyp einstellen können.
  2. Die Konfigurationsdateien werden synchron geladen, so dass beim Erstellen eines ersten Falls von vielen Steuerelementen mit einer langsamen Verbindung die App nicht reagiert.
  3. Ein besserer Weg wäre für eine Fabrikfunktion, um ein Versprechen zurückzugeben, sodass Sie jedes Mal die Kontrolle erstellen, und die Konfigurationsdateien können asynchron abgerufen werden.

    [update]

    Blick auf die Konfiguration Es scheint für die gesamte GUI-Bibliothek zu konfigurieren zu sein, damit ich keinen Grund sehen kann, warum dies erst nach dem Erstellen einer ersten Instanz geladen wird. Eine Bibliothek, die die Objektdefinitionen von Object-Definitionen ändert, wenn Instanzen, die Instanzen erstellen, nicht leicht ausdehnt, da er unvorhersehbar ist. Wenn es nur den Prototyp bei der ersten Erstellung ändert, sollte es in Ordnung sein, aber es sieht so aus, als wären die Macher der Bibliothek nicht, dass die Menschen nicht erweitern möchten, oder sie würden die Objektdefinition nicht unvorhersehbar machen. Wenn es eine API-Dokumentation gibt, versuchen Sie es vielleicht, dies zu überprüfen.

    [update]

    Es scheint, dass der "korrekte" Weg, um die Kontrollen zu erweitern, ist das Verwenden von erstrecken sich .

Andere Tipps

@HMR ist der richtige Weg, um eine Steuerung zu erweitern, indem die erweiterte Funktion von UI5 verwalteten Objekten verwendet wird.Siehe http://jsbin.com/linolob/1/edit

In dem nachstehenden Beispiel, wenn Sie das Debuggen von anderen, das von anderen nicht gemilgt ist, werden feststellen, dass die Steuerung bei Bedarf lastend geladen ist. Alle Änderungen, die Sie vor dem Laden erstellen, gehen beim Laden

generasacodicetagpre.

es versteckt den Prototyp nicht an sich. Wenn eine Konstruktorfunktion normal austritt, erhalten Sie den Prototyp dieser Funktion. Wenn jedoch eine Konstruktor-Funktion ein anderes Objekt zurückgibt, erhalten Sie den Prototyp eines anderen Objekts, sodass es nicht gilt, dass Sie angenommen werden, dass nur weil Sie dem Button-Prototyp hinzugefügt werden, den, wenn Sie neue Button () aufrufen Du kommst zurück. Ich bin sicher, wenn Sie diesen Code dekorieren, dass Sie feststellen, dass der Construstor, den Sie anrufen, ein "Return New TatherInstanceOfbutton ()" oder ähnlich am Ende.

edit: ok Es ist ein bisschen schwierig, zu sehen, was in diesem SAP-Code wirklich los ist, aber es sieht so aus, als hätten sie Code, der die Prototypen von Steuerelementen überschreibt, um ihnen Funktionen hinzuzufügen, z. B. SAP.UI.CORE.EN.EnabledPropagator , und diese Dinge laufen nicht, bis Sie tatsächlich einen Knopf instanziieren. Wenn Sie also Ihren Code ändern, um die Schaltfläche auf der Seite zu instanziieren, dann fügen Sie dem Prototyp hinzu, dann bauen Sie das Verfahren auf und rufen Sie die Methode auf, es funktioniert gut. Wie so:

http://jsbin.com/benajuko/2/edit

Ich denke, meine Antwort ist, wenn Sie es von der Konsole ausführen, ist es mit diesem Prototyp fertig, während Sie in Ihrem Test in Ihrem Test zum Prototyp hinzufügen, und dann zum ersten Mal die Taste bauen (was den Prototyp erneut ändert) dann versuche, deinen alten anzurechnen, was nicht mehr da ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top