5

オートコンプリートには、TypeAheadでinputTextXPagesコントロールを使用しています。検索フィールドに入力しても、候補は表示されません。[タイプアヘッド]プロパティペインに設定されているカンマ区切りの候補のリストがあり、提案の区切り文字は "、"です。また、「改行」で区切られた提案を使用してみました。最小文字数は「1」です。inputTextのxmlは次のとおりです。

<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>

モード「full」と「partial」の両方を使用すると失敗しますが、エラーが異なります。「フル」を使用すると、検索フィールドに入力された文字ごとに、ブラウザコンソールに次のエラーが表示されます(はい、これらはすべて1回のキー押下が原因です)。

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

同様に、モード「partial」の場合、入力された文字ごとに次のエラーメッセージが表示されます。

'url' is null or not an object

この最後のエラーは、dojo.js(Lotus Notes 8.5.3、14行目、文字84996で使用される縮小版)で発生します。縮小されたスクリプトに記載されていないため、これがどのバージョンのdojoであるかはわかりませんが、バージョン1.6.1はほぼ正しいバージョンであると考えています。エラーの原因となるコードを特定しました。

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;
    }
};

それがioArgs.url += ...エラーの原因です。

inputTextに対して生成されたマークアップは次のようになります。

<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>

任意の提案(しゃれを意図した)は大歓迎です!

4

1 に答える 1

4

XPagesプロパティcreateFormを確認してください。がfalseに設定されている場合は、削除するか、trueに変更します。

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

Type Ahead機能は、HTMLフォームのactionプロパティからターゲットURLを計算します。このフォームが利用できない場合、先のタイプは失敗します。自動生成されたフォームを無効にする必要がある場合は、フォームをXPageに手動で追加する必要があります。

編集:

または、TypeaheadデータストアのCSJSコードを上書きし、fetchメソッドを操作してXPageのURLを挿入することもできます。

編集2:

先行入力を修正するスクリプトブロックは次のとおりです。

<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>
于 2012-11-27T14:31:35.010 に答える