2012-11-27 8 views
5

Wir verwenden ein inputText XPages-Steuerelement mit Type Ahead für die automatische Vervollständigung. Wenn Sie in das Suchfeld tippen, erscheinen keine Vorschläge. Wir haben eine Liste kommagetrennter Vorschläge, die im Eigenschaftenbereich "Typ Ahead" festgelegt sind, und das Vorschlags-Trennzeichen ist ",". Wir haben auch versucht, "neue Zeile" getrennte Vorschläge zu verwenden. Mindestzeichen ist "1". Hier ist die xml für die input:XPages Typ Ahead schlägt beim Laden von Vorschlägen fehl

<xp:inputText id="inputText2"> 
<xp:typeAhead mode="partial" minChars="1" ignoreCase="true" valueListSeparator=","> 
    <xp:this.valueList><![CDATA[Homer,Marge,Bart,Lisa,Maggie]]></xp:this.valueList> 
</xp:typeAhead> 
</xp:inputText> 

Mit Modus „voll“ und „teilweise“ beide ausfallen, aber mit verschiedenen Fehlern. Bei der Verwendung von „voll“, für jeden Buchstaben in das Suchfeld eingegeben haben die folgenden Fehler in der Browser-Konsole angezeigt werden (ja, sind alle diese durch einen einzigen Tastendruck verursacht):

Error: Unable to load undefined status:404 
dijit.form.ComboBox: Error: Unable to load undefined status:404 
Error: Unable to load undefined status:404 
Error: Unable to load undefined status:404 
Error: Unable to load undefined status:404 

Ähnlich für den Modus „teilweise“ , wird die folgende Fehlermeldung angezeigt wird jeder für den Buchstaben getippt:

'url' is null or not an object 

Dieser letzte Fehler entsteht in dojo.js (minimierte Version mit Lotus Notes verwendet 8.5.3, Zeile 14, 84996 Zeichen). Wir sind nicht sicher, welche Version von dojo das ist, weil es nicht im minimierten Skript angegeben ist, aber wir denken, Version 1.6.1 ist ungefähr die richtige Version. Wir haben den Code isoliert, die den Fehler verursacht:

dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){ 
    //summary: Adds query params discovered by the io deferred construction to the URL. 
    //Only use this for operations which are fundamentally GET-type operations. 
    if(ioArgs.query.length){ 
     ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query; 
     ioArgs.query = null; 
    } 
}; 

Es ist ioArgs.url += ..., die den Fehler verursacht.

Der generierte Markup für das input sieht wie folgt aus:

<span id="view:_id36:_id38:_id119" dojotype="ibm.xsp.widget.layout.data.TypeAheadReadStore" jsid="view__id36__id38__id119" mode="full"></span> 
<div class="dijit dijitReset dijitInlineTable dijitLeft xspInputFieldEditBox dijitTextBox dijitComboBox" id="widget_view:_id36:_id38:inputText2" role="combobox" widgetid="view:_id36:_id38:inputText2"> 
<div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" dojoattachpoint="_buttonNode, _popupStateNode" role="presentation" style="display: none;"> 
    <input class="dijitReset dijitInputField dijitArrowButtonInner" value="? " type="text" tabindex="-1" readonly="readonly" role="presentation"> 
</div> 
<div class="dijitReset dijitValidationContainer"> 
    <input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="? " type="text" tabindex="-1" readonly="readonly" role="presentation"> 
</div> 
<div class="dijitReset dijitInputField dijitInputContainer"> 
    <input class="dijitReset dijitInputInner" name="view:_id36:_id38:inputText2" type="text" autocomplete="off" dojoattachpoint="textbox,focusNode" role="textbox" aria-haspopup="true" id="view:_id36:_id38:inputText2" tabindex="0" value=""> 
</div> 
</div> 

Irgendwelche Vorschläge (pun intended) wäre sehr dankbar!

+0

Hit F12 und sucht den Netzwerkverkehr, dann überprüfen, was url/Nachfrage verursacht Fehler 404. –

+0

und Check Warum erhalten Sie eine Fehlermeldung über dijit.form.ComboBox. Haben Sie eine ComboBox auf der gleichen Seite, die fehlschlägt? Versuchen Sie, diese ComboBox aus der XPage zu entfernen und zu sehen, was passiert. –

+0

@FrantisekKossuth Die Anfrage, die den Fehler verursacht, ist (mit anonymisierten Server- und Datenbanknamen): http: // .com/ .nsf/undefined. –

Antwort

4

Überprüfen Sie bitte die XPages-Eigenschaft createForm. Wenn auf false eingestellt ist, entfernen Sie es oder ändern Sie es in true.

<xp:view xmlns:xp="http://www.ibm.com/xsp/core" createForm="true"> 

Der Typ Ahead-Funktionalität berechnet die Ziel-URL aus der Aktion Eigenschaft des HTML-Formular. Wenn dieses Formular nicht verfügbar ist, schlägt der vorausgehende Typ fehl. Wenn Sie das automatisch generierte Formular deaktivieren müssen, müssen Sie dem XPage manuell ein Formular hinzufügen.

Edit:

Alternativly Sie den CSJS Code des typeahead Datenspeicher überschreiben könnte und manipulieren die Methode holen Sie Ihre URL Ihrer XPage zu injizieren.

Edit 2:

Hier ist ein Skriptblock, der die typeahead behebt:

<xp:scriptBlock id="scriptBlockFixTypeAhead"> 
    <xp:this.value> 
     <![CDATA[dojo.addOnLoad(function(){ 
      ibm.xsp.widget.layout.data.TypeAheadReadStore.prototype.fetch = function tars_f(_5) { 
      var _6 = _5.query.name; 
      if (_6.length < this.minChars) { 
       _5.onComplete([], _5); 
       return; 
      } 
      this.content.$$value = _6; 
      var _7 = {url: '#{javascript:context.getUrl().getPath()}', 
       handleAs: "text", timeout: XSP.submitLatency, content: this.content, 
       form: this.sendForm ? this.formId : null, 
       load: dojo.hitch(this, this.retrieved, _5), 
       error: dojo.hitch(_5, _5.onError)}; 
      dojo.xhr(this.method, _7, !this.contentInUrl); 
      return _5; 
     }}) 
    ]]></xp:this.value> 
</xp:scriptBlock> 
+0

Vielen Dank für Ihre Antwort. createForm wurde auf unserer Seite tatsächlich auf false gesetzt. Wenn Sie es auf "true" setzen, wird ein Teil des Problems behoben, es steht jedoch in Konflikt mit anderen Funktionen auf unserer Seite. Das manuelle Hinzufügen des Formularelements ist ebenfalls problematisch. Wir werden später auf dieses Thema zurückkommen müssen, da wir im Moment keine Zeit haben. –

+0

@ Øystein Jaren Samuelsen: Ich habe einen weiteren Workaround hinzugefügt, einen harten Hack des CSJS-Codes. Fügen Sie einfach den Skriptblock zu Ihrer Seite hinzu. Hoffe das hilft. –

Verwandte Themen