2013-08-18 10 views
6

Von den zwei Möglichkeiten muss ich auf den Wert eines Steuerelements zugreifen, das am effizientesten ist?Welcher ist der effizienteste Weg, um auf den Wert eines Steuerelements zuzugreifen?

getComponent("ControlName").getValue(); 

oder

dataSource.getItemValue("FieldName"); 

Ich finde, dass gelegentlich die getComponent scheint nicht den aktuellen Wert zurück, aber die dataSource Zugriff scheint zuverlässiger zu sein. Macht es also aus Performance-Sicht einen Unterschied, welchen man benutzt?

Der dataSource.getValue scheint überall zu funktionieren, dass ich es versucht habe. Wenn ich jedoch mit rowData arbeite, muss ich immer noch einen rowData.getColumnValue ("Something") machen. rowData.getValue ("Etwas") schlägt fehl.

+0

Es kann auch Unterschiede in der Art von Wert geben, den Sie von Komponente vs Datenquelle erhalten. –

Antwort

17

Weder. Die schnellste Syntax ist dataSource.getValue ("FieldName"). Die Methode getItemValue ist nur für die Dokumentdatenquelle verlässlich, während die Methode getValue nicht nur für Ansichtseinträge verfügbar ist, auf die über eine Datenquelle zugegriffen wird. In diesem Kontext würden Sie jedoch den programmatischen Namen einer Ansichtsspalte übergeben Dieselbe Bezeichnung wie ein Feld, aber auch für benutzerdefinierte Datenquellen, die Sie entwickeln oder installieren (z. B. Bibliotheken von Drittanbietern). Darüber hinaus wird eine automatische Typumwandlung durchgeführt, die Sie selbst durchführen müssten, wenn Sie stattdessen getItemValue verwenden.

Selbst auf sehr einfache Seiten, dataSource.getValue ("FieldName") ist 5 mal so schnell wie getComponent ("id").getValue(), weil, wie Fredrik erwähnt, zuerst muss es die Komponente finden, und dann fragen, was der Wert ist ... die, hinter der Szenen, fragt nur die Datenquelle trotzdem. So ist es immer schneller, die Datenquelle selbst zu fragen.

HINWEIS: Die entsprechende Schreibmethode lautet dataSource.setValue ("FieldName", "NewValue"), nicht dataSource.replaceItemValue ("FieldName", "NewValue"). Beide funktionieren, aber setValue macht auch die gleiche Typumwandlung, die getValue tut, so dass Sie Daten übergeben können, die nicht strikt der alten Domino Java API entsprechen und in der Regel nur herausfindet, in welche Werte der Wert konvertiert werden muss "sicher" sein, damit Domino sie speichert.

+0

Danke, das ist wirklich wichtig zu wissen, dass ich eine XPage habe, dass ich diese Art von Nachschlagen mache. Nun zurück zum Code und finde all die Orte, an denen ich diese nutze und ändere sie. Dies ist ein Beitrag, den ich in mein Cheatsheet-Dokument für zukünftige Referenz und Erinnerung kopiert habe. Oft ist die offensichtlichste Methode weit von der besten Methode entfernt. –

+0

Hier ist ein bisschen ein Follow-up. In einem Wiederholungssteuerelement zeige ich Werte aus den rowData an, indem ich ein computedField an ein fieled in den rowData binde. Ich nehme an, dass ein rowData.getValue schneller wäre? –

+0

Ah - ein unschätzbares (Wortspiel beabsichtigt) Best Practice für die Entwicklung: nie nach dem Gegenstück/Thingi gehen, bleiben Sie bei der Datenquelle. – stwissel

4

Ich würde sagen, dass der effizienteste Weg ist, den Wert direkt von der Datenquelle zu bekommen. Weil, wenn Sie getComponent ("ControlName") verwenden. GetValue(); Sie werden zuerst die Komponente aufrufen und dann einen getValue. So ist ein einzelnes Get von der Datenquelle effizienter, wenn Sie mich fragen.