2017-08-03 42 views
6

Tôi có ứng dụng Angular 2 sử dụng các thành phần PrimeNG.Góc: trường tự động hoàn tất thay đổi tiêu điểm sau khi xóa một mục

Giao diện có phần autocomplete với đa chọn (p-autoComplete) tương tự như một trong các từ the documentation:

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

Sự khác biệt duy nhất là trong trường hợp của tôi lĩnh vực đầu vào đã cố định kích thước và thanh cuộn.

Vấn đề:

Mỗi lần khi tôi loại bỏ một phần tử từ giữa của danh sách autocomplete nó di chuyển tập trung vào dưới cùng của lĩnh vực đầu vào. Nó trông giống như thế này:

enter image description here

nó là rất khó chịu cho người dùng, đặc biệt là khi có một số lĩnh vực mà cần được loại bỏ.

Câu hỏi: Làm cách nào để buộc cuộn ở trên cùng một vị trí sau khi xóa phần tử?

Làm thế nào để tái sản xuất:

Để cụ thể hơn, bạn có thể tạo lại vấn đề bằng cách thêm css tiếp theo

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

trực tiếp trên lớp documentation page vào ui-autocomplete-multiple-container.ui-inputtext css sử dụng trình duyệt console.

UPDATE: tôi quản lý để có được vị trí cuộn bằng cách thiết lập onUnselect phương pháp trong các thành phần sử dụng mã như thế này:

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

UPDATE 2: Tôi quản lý để làm cho nó hoạt

Giải pháp là sự kết hợp của các trình xử lý sự kiện onUnselectonFocus.

Trước tiên. Tôi lưu vị trí cuộn cuối cùng vào một trường trong cuộc gọi onUnselect.

Thứ hai. Tôi đặt giá trị này thành phần tử được chỉ định trong khi gọi onFocus.

Mã tương ứng trông như thế này:

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

Nó hoạt động tốt và có lẽ đây sẽ là giải pháp cuối cùng.

Tuy nhiên tôi không thích. Sẽ tốt hơn nếu các chàng trai của PrimeNG nhúng một chức năng hữu ích vào trong thành phần của họ. Đối với tôi, nó lạ ở sao nó không ra khỏi hộp.

Nếu bạn tìm thấy giải pháp tốt hơn, vui lòng đề xuất.

+0

bạn có thể tạo một plunker để tái tạo? – Aravind

+0

Dường như con trỏ đang gây ra hành vi nhảy. Vì vậy, tôi khuyên bạn nên cố gắng vô hiệu hóa con trỏ khi một mục bị xóa (có thể bằng cách vô hiệu hóa phần tử) hoặc thử chuyển tiêu điểm sang một phần tử khác trước khi xóa mục đó. Tôi không biết nếu điều khiển bạn đang sử dụng sẽ cho phép bạn làm điều đó nhưng tôi không thể kiểm tra nó cho đến khi tôi nhận được quyền truy cập vào máy tính – Sal

+0

Ngoài ra, đây là một trong những câu hỏi có cấu trúc tốt nhất mà tôi đã thấy. Thật dễ dàng để xem/hiểu vấn đề của bạn. Cảm ơn bạn đã dành thời gian và công sức cho nó! – Sal

Trả lời

1

Bạn nên sử dụng onFocus kiện để xử lý tương tự như dưới đây,

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

    .... 


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

} 

LIVE DEMO

+1

Có thể tôi đang làm điều gì đó sai, nhưng tôi đã thử và nó không hoạt động. Và bản demo không có thanh cuộn nên không có cách nào để kiểm tra. Dù sao tôi không hiểu làm thế nào có thể thiết lập ảnh hưởng của tài sản window's trên thanh cuộn bên trong yếu tố trang cụ thể? Trong trường hợp của tôi, tôi cần đặt vị trí của bộ cuộn trong phần tử đầu vào, không phải vị trí của phần tử cuộn từ trang. –

+0

@OleksandrShpota giảm kích thước cửa sổ và kiểm tra. – Aravind

+0

Bây giờ tôi hiểu ý của bạn là gì. Có thể là câu hỏi không hoàn toàn rõ ràng - tôi cần phải kiểm soát cuộn trên phần tử đầu vào, không phải là câu hỏi từ cửa sổ. Mã bạn đề xuất thay đổi vị trí cuộn của cửa sổ. –

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

Bạn đề xuất chính xác cách đặt vị trí cuộn? Tôi lấy phần tử và thiết lập 'scrollTop' của nó và nó không hoạt động ngay cả khi không tính toán. Giả sử tôi đặt 'scrollTop' của phần tử thành 100 - cuộn sẽ nhảy xuống phía dưới giống như trước. –

+0

kiểm tra câu trả lời cập nhật –

+0

Đây chính xác là những gì tôi vừa giải thích trong bình luận của mình, tôi đã thử cách này và nó không hoạt động: ( –

Các vấn đề liên quan