Đây là giải pháp của tôi.
Tôi muốn làm nổi bật dữ liệu trong Biểu mẫu được thay đổi bởi người dùng khác trong thời gian thực.
Trong biểu mẫu HTML của tôi, tôi đã thay thế các phần tử html gốc bằng thành phần Góc. Đối với mỗi loại phần tử gốc tôi đã tạo ra một thành phần Angular mới với hỗ trợ Highlight. Mỗi thành phần triển khai giao diện góc ControlValueAccessor Góc.
Trong form cha tôi đã thay thế các yếu tố tự nhiên:
<input [(ngModel)]="itinerary.DetailWeather" />
bởi yếu tố tùy chỉnh của tôi:
<reactive-input [(ngModel)]="itinerary.DetailWeather"></reactive-input>
Khi cuộc gọi kiễu góc detectChanges() cho form cha, nó rà soát tất cả dữ liệu được sử dụng làm đầu vào bởi các thành phần của biểu mẫu.
Nếu một thành phần là một ControlValueAccessor và thay đổi xảy ra trong mô hình ứng dụng, nó gọi phương thức ControlValueAccessor. writeValue (giá trị). Nó là phương thức được gọi khi dữ liệu thay đổi trong bộ nhớ. Tôi sử dụng nó như một cái móc để cập nhật tạm thời kiểu để thêm đánh dấu.
Đây là phần tử tùy chỉnh. Tôi đã sử dụng Ảnh động góc để cập nhật màu đường viền và mờ dần về màu gốc.
import { Component, Input, forwardRef, ChangeDetectorRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { trigger, state, style, animate, transition, keyframes } from '@angular/animations';
@Component(
{
selector: 'reactive-input',
template: `<input class="cellinput" [(ngModel)]="value" [@updatingTrigger]="updatingState" />`,
styles: [`.cellinput { padding: 4px }`],
animations: [
trigger(
'updatingTrigger', [
transition('* => otherWriting', animate(1000, keyframes([
style ({ 'border-color' : 'var(--change-detect-color)', offset: 0 }),
style ({ 'border-color' : 'var(--main-color)', offset: 1 })
])))
])
],
providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReactiveInputComponent), multi: true } ]
})
export class ReactiveInputComponent implements ControlValueAccessor {
public updatingState : string = null;
_value = '';
// stores the action in the attribute (onModelChange) in the html template:
propagateChange:any = (change) => {};
constructor(private ref: ChangeDetectorRef) { }
// change from the model
writeValue(value: any): void
{
this._value = value;
this.updatingState = 'otherWriting';
window.setTimeout(() => {
this.updatingState = null;
}, 100);
// model value has change so changes must be detected (case ChangeDetectorStrategy is OnPush)
this.ref.detectChanges();
}
// change from the UI
set value(event: any)
{
this._value = event;
this.propagateChange(event);
this.updatingState = null;
}
get value()
{
return this._value;
}
registerOnChange(fn: any): void { this.propagateChange = fn; }
registerOnTouched(fn:() => void): void {}
setDisabledState?(isDisabled: boolean): void {};
}
là câu hỏi này chỉ dành riêng cho các yếu tố 'đầu vào'? và ý bạn là gì bởi 'thay đổi'? _Tôi đã nghe về các phong cách lớp học đặc biệt do Angular2_ đặt ra - bạn có nghĩa là lớp 'ng-bẩn' không? nếu có, hãy thử thêm một kiểu cho 'input.ng-dirty {background-color: green}' –
Nó dành riêng cho các phần tử có chỉ thị ngModel. Dường như ng-dirty/ng-touch không cung cấp giải pháp vì chúng phụ thuộc vào hành động của người dùng trên điều khiển. Trong trường hợp của tôi thay đổi không được thực hiện bởi người sử dụng. Nó chỉ là một sự thay đổi trong mô hình dữ liệu. – abreneliere
_Trong trường hợp thay đổi của tôi không được thực hiện bởi người dùng._ - bạn có thể hiển thị một ví dụ không? –