यहां मेरा समाधान है।
मैं प्रपत्र में डेटा को हाइलाइट करना चाहता था जो वास्तविक समय में अन्य उपयोगकर्ताओं द्वारा बदला जाता है।
मेरे एचटीएमएल फॉर्म में, मैंने कोणीय घटकों द्वारा मूल HTML तत्वों को प्रतिस्थापित किया। प्रत्येक प्रकार के मूल तत्व के लिए मैंने हाइलाइट समर्थन के साथ एक नया कोणीय घटक बनाया। प्रत्येक घटक ControlValueAccessor कोणीय इंटरफ़ेस लागू करता है। अपने कस्टम तत्व द्वारा
<input [(ngModel)]="itinerary.DetailWeather" />
:
माता पिता रूप में मैं देशी तत्व की जगह
<reactive-input [(ngModel)]="itinerary.DetailWeather"></reactive-input>
जब कोणीय कॉल detectChanges() माता-पिता फार्म के लिए, यह सब जाँच करता है डेटा के रूप में इनपुट के रूप में उपयोग किए जाने वाले डेटा।
यदि कोई घटक ControlValueAccessor है, और एप्लिकेशन मॉडल में कोई परिवर्तन हुआ है, तो यह विधि ControlValueAccessor को कॉल करता है। लिखें वैल्यू (मूल्य)। यह विधि है जिसे स्मृति में डेटा बदलते समय कहा जाता है। मैं हाइलाइट जोड़ने के लिए अस्थायी रूप से शैली को अद्यतन करने के लिए इसे एक हुक के रूप में उपयोग करता हूं।
यहां कस्टम तत्व है। मैंने सीमा रंग को अद्यतन करने और मूल रंग में वापस फीका करने के लिए कोणीय एनिमेशन का उपयोग किया।
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 {};
}
क्या यह प्रश्न केवल 'इनपुट' तत्वों के लिए विशिष्ट है? और 'बदले' से आपका क्या मतलब है? _ मैंने Angular2_ द्वारा निर्धारित विशेष श्रेणी शैलियों के बारे में सुना - क्या आपका मतलब 'ng-dirty' वर्ग है? यदि हां, तो 'input.ng-dirty {background-color: green} ' –
' के लिए बस शैली जोड़ने का प्रयास करें, यह ngModel निर्देश वाले तत्वों के लिए विशिष्ट है। ऐसा लगता है कि एनजी-गंदे/एनजी-स्पर्श एक समाधान प्रदान नहीं करता है क्योंकि वे नियंत्रण पर उपयोगकर्ता की कार्रवाई पर निर्भर करते हैं। मेरे मामले में परिवर्तन उपयोगकर्ता द्वारा नहीं किया जाता है। यह डेटा मॉडल में सिर्फ एक बदलाव है। – abreneliere
_ मेरे मामले में परिवर्तन उपयोगकर्ता द्वारा नहीं किया जाता है ._ - क्या आप एक उदाहरण दिखा सकते हैं? –