2017-08-03 2 views
6

私は、PrimeNGコンポーネントを使用するAngular 2アプリを持っています。角:項目を削除した後、オートコンプリートフィールドがフォーカスを変更します

UIは、the documentationのものと同様のマルチセレクト(p-autoComplete)とオートコンプリート成分を有する:

<p-autoComplete [(ngModel)]="countries" 
       [suggestions]="filteredCountriesMultiple" 
       (completeMethod)="filterCountryMultiple($event)" 
       [minLength]="1" 
       placeholder="Countries" 
       field="name" 
       [multiple]="true"> 
</p-autoComplete> 

唯一の違いは、私の場合、入力フィールドは、寸法およびスクロールバーを固定していることです。

問題:

私はそれが入力フィールドの下にフォーカスを移動オートコンプリートリストの途中から要素を削除するたびに。それは次のようになります。

enter image description here

それは除去されなければならないいくつかのフィールドがある場合は特に、ユーザにとって非常に迷惑です。

質問:要素を削除した後にスクロールを同じ位置にとどまらせる方法を教えてください。

をより具体的には、ブラウザのコンソールを使用してdocumentation pageui-autocomplete-multiple-container.ui-inputtextへのCSSクラスに直接次のCSS

max-width: 150px; 
max-height: 100px; 
overflow-y: auto; 

を追加することによって、問題を再現することができます再現するためにどのように

onUnselect(event: any) { 
    document.querySelector("div.my-input-class").scrollTop 
} 

UPDATE 2:私はこのようなコードを使用してコンポーネントにonUnselect方法を設定することでスクロール位置を取得するために管理 :UPDATEが01​​

私はそれを動作させるために管理

解決策は、onUnselectonFocusイベントハンドラの組み合わせです。

最初。最後のスクロールポジションをonUnselectコールのフィールドに保存します。

秒。私はonFocus呼び出し中にこの値を指定された要素に設定しました。

対応するコードは次のようになります。

scrollPosition: number = 0; 

onUnselect(event: any) { 
    let input = document.querySelector("div.my-input-class"); 
    this.scrollPosition = input.scrollTop; 
} 

onFocus(event: any) { 
    let input = document.querySelector("div.my-input-class"); 
    input.scrollTop = this.scrollPosition; 
} 

それがうまく機能し、おそらくこれが最終的なソリューションとなります。

しかし、私はそれが好きではありません。 PrimeNGの人がそのような便利な機能をコンポーネントに組み込むと、はるかに良いでしょう。私にとって、なぜそれが箱から出てこないのか不思議です。

あなたがより良い解決策を見つけたら、ご提案ください。

+0

onFocusイベントを使用すべきですか? – Aravind

+0

カーソルがジャンプ動作を引き起こしているようです。だから私は、アイテムが削除されたときに(おそらく要素を無効にして)カーソルを無効にするか、アイテムを削除する前に他の要素にフォーカスを切り替えてみることをお勧めします。あなたが使っているコントロールがあなたにそれをさせるかどうかはわかりませんが、コンピュータにアクセスするまではテストできません。 – Sal

+0

また、これは私が見てきた構造化された質問のうちの一つです。あなたの問題を見て/理解するのは本当に簡単でした。時間と労力をかけてくれてありがとう! – Sal

答えて

1

あなたが再現するplunkerを作成することができ、下記のと同じように処理するために

<p-autoComplete [(ngModel)]="countries" 
       [suggestions]="filteredCountriesMultiple"      
       (completeMethod)="filterCountryMultiple($event)" 
       styleClass="width12" (onFocus)="onFocus($event)"> 

    .... 


onFocus(event){ 
     window.scrollTo(0, 0); 

} 

LIVE DEMO

+1

私は間違ったことをしているかもしれませんが、試しましたが、うまくいきません。デモにはスクロールバーがありませんので、チェックする方法はありません。とにかく、私はどのように特定のページ要素内のスクロールバーにウィンドウのプロパティの影響を設定することができます理解していない?私の場合は、ページからの入力ではなく、入力要素内でスクロールの位置を設定する必要があります。 –

+0

@OleksandrShpotaはウィンドウのサイズを小さくしてテストします。 – Aravind

+0

今私はあなたが意味するものを得ます。質問が完全にはっきりしないかもしれない - 私はウィンドウからのものではなく、入力要素のスクロールを制御する必要がある。あなたが提案したコードはウィンドウのスクロールバーの位置を変更します。 –

1
onUnselect(event: any) { 
    // get index of the removed element 
    // get total options count 
    // get height of the element that contains the options 
    // divide the height by number of options 
    // set scroll potion to the result of division multiplied by the index 
    document.querySelector('.ui-autocomplete-multiple-container.ui-inputtext').scrollTop = calculatedValue; 
} 
+0

スクロール位置を設定する方法を正確に提案しますか?私は要素を取得し、その 'scrollTop'を設定し、計算なしでは機能しません。要素の 'scrollTop'を100に設定したとしましょう - スクロールは前と同じように底にジャンプします。 –

+0

Check updated Answer –

+0

これはちょうど私のコメントで説明したとおりです。この方法で試してもうまくいきません:( –

関連する問題