ç³ãèš³ãããŸããããç§ã¯è±èªãèŠæã§ãã
@Input
ããããã£å€ã¯ã芪ã³ã³ããŒãã³ãã«ãã£ãŠæäŸãããŸãã å€æŽã¯éåæã§è¡ãããŸãã
ãŸããåã³ã³ããŒãã³ãã§Inputããããã£ãå€æŽãããå ŽåïŒç¬èªã®ããããã£ãšããŠããããã£ãæã£ãŠããå ŽåïŒããã®å€æŽæ€åºåšã¯ãããèªèããŸããã
@Component({ selector: "child" })
class Child {
@Input("input") inputValue: Observable<T>;
ngOnInit() {
this.inputValue.map((value)=>...);
}
}
@Component({
template: `
<child [input]="valueToChild"></child>
`
})
class Parent {
valueToChild: T;
}
äžèšã®ã³ãŒãã¯æ©èœããŸããã çŸåšã Observable<T>
ãšããŠå
¥åãåãåãã«
@Component({ selector: "child" })
class Child {
@Input("input") inputValue: Observable<T>
}
@Component({
template: `
<child [input]="valueToChild"></child>
`
})
class Parent {
valueToChild: Observable<T> = new Observable<T>((observer)=>{
...
observer.next(val);
});
}
äŸïŒ http ïŒ
ããã¯ããŸãæ©èœããŸãããå¿ é ã§ã¯ãããŸããã 芪ã®å ¥åããŒã¿ã¯å ã åçŽãªããŒã¿ã§ãã
ãã®ææ¡ã¯ç§ãã¡ã幞ãã«ãããšæããŸãã
ããããšãã
ããã«ã¡ã¯@ laco0416-ããªãã®è±èªã¯å€§äžå€«ã§ããå¿é ããªãã§ãã ããïŒ
ç§ã¯ãã®ã¢ã€ãã¢ããšãŠã奜ãã§ãããããŠããã¯ç§ãã¡ã以åã«è°è«ãããã®ã§ãã ãŸãã httpsïŒ//github.com/angular/angular/issues/4062 ïŒãã¥ãŒã€ãã³ãã®ç£èŠïŒããã³https://github.com/angular/angular/issues/5467 ïŒèŠªããã®ç£èŠå¯èœãªåã€ãã³ãïŒãšãããäžèŽããŸã
誰ããObservablesã䜿ããããããã§ã¯ãªãããšãèŠããŠããããšãéèŠã§ãïŒãããã®äººã
ã¯èŠéããŠããŸãïŒïŒããããã£ãŠãäž¡æ¹ã®ãŠãŒã¹ã±ãŒã¹ã«ãªãã·ã§ã³ãæäŸããå¿
èŠããããŸãããããã£ãŠã @Input()
çŽæ¥Observableã«ããããšã¯ã»ãšãã©ãããŸããã @ObserveInput()
ãããªãã®ãããã°ããŸããããšæããŸããããŒã¿çãåºè·ããåŸããããã®ããèå³æ·±ãæ©èœã®ããã€ãã«ã€ããŠè©±ãåããŸãã
ãããŸã§ã®éããã®ã¢ã€ãã¢ã®åºæ¬çãªïŒãããŠ_éåžžã«_å®éšçãª!!!å®éã«ã¯ãããè¡ããªãã§ãã ããïŒå®è£ ã次ã«ç€ºããŸãã ããã¯æŠå¿µçã«ããªããèããŠãããã®ã§ããïŒ http://plnkr.co/edit/Nvyd9IPBZp9OE2widOcW?p=preview
åã³ã³ããŒãã³ãã®å ¥åããããã£ãå€æŽããã®ã¯éåžžã«æªãèãã ãšæããŸãã å ¥åããããã£ã¯ãèªã¿åãå°çšãã§ããå¿ èŠããããŸãã ããŒã¿ã¯åžžã«èŠªããåã«æµããå¿ èŠããããŸãïŒéæ¹åã«ã¯æµããªãããã«ããŠãã ããïŒã
@alexpodsããã§ã®èãæ¹ã¯ãŸãã«ããã ãšæããŸã-å ¥åããããã£ã®å€æŽã_èã__as_ Observableã§ãããã¢ããã¹ããªãŒã ã§å€ãåºåããŸãããããã¯ãç§ã«é¢ããéãããŸã£ããåé¡ãããŸããã
@robwormald
ããªãã®è±èªã¯å€§äžå€«ã§ããå¿é ããªãã§ãã ããïŒ
ããããšãïŒ ã»ã£ãšããŸããã
ããªãã®@ObserveInput
ã¯ç§ã欲ãããã®ã§ãïŒ
ãŸãã @Input
ã«é倧ãªå€æŽã¯ãããŸããã ãšãŠãè¯ã解決çã ãšæããŸãã
@alexpodsç§ãå šç¶ã
å ¥åããããã£ã®å€æŽãObservableãšããŠãªãã¹ã³ããã¢ããã¹ããªãŒã ã§å€ãåºåããŸãããããã¯ãç§ã«é¢ããéãããŸã£ããåé¡ãããŸããã
ãããšåãããã«æããŸãã
@ laco0416ããã誀解ããŠãã¿ãŸããã ãåã³ã³ããŒãã³ãã§Inputããããã£ãå€æŽãããå Žåããšãããã¬ãŒãºã¯ãç§ãæ··ä¹±ãããŸããã
ããã«ã³ã¡ã³ãããã¹ããããããšãæ°ããåé¡ãéãã¹ããããããŸããã ééã£ãå Žæã«ãªã¯ãšã¹ããè¿œå ããå Žåã¯ãç¥ãããã ããã
ç§ã¯ãã®ãããªãã³ã¬ãŒã¿ãæžã蟌ãããšããŠããŸãããïŒãããä»ãŸã§å€±æããŸããïŒã @ robwormaldã®plunkrã«åºããããŸãããããã¯ãã»ãŒå®å šã«æ©èœããŸãïŒãã ããå®å šã«ã¯æ©èœããŸããïŒã
ãã®ã¢ãããŒãã«ç§ãè奮ããã®ã¯ããããngOnChanges
ã©ã€ããµã€ã¯ã«ããã¯ã掻çšããŠãããšããäºå®ã§ããã
ç§ãèŠããã®ã¯ã_all_ã©ã€ããµã€ã¯ã«ããã¯ãObservablesãšããŠãã€ãŸãonChanges$: Observable<{[key: string]: SimpleChange}>
ã onInit$: Observable<{}>
ãªã©ãšããŠå
¬éããæ¹æ³ã§ãã
ãã¹ãŠã®ã©ã€ããµã€ã¯ã«ããã¯ãObservablesãšããŠå©çšã§ããããã«ãããšããã¹ãŠã®ãã®ãRxããã®ã«åœ¹ç«ã¡ãŸã;-)
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
AFAIKããããã
@robwormaldäœããã¥ãŒã¹ã¯ãããŸããïŒ
ç§ã¯ãããå€ãããšãç¥ã£ãŠããŸãããããã¯çŽ æŽãããã§ãããïŒ @robwormaldããã«ã€ããŠäœãèšèã¯ãããŸããïŒ
@robwormaldã®@ObserveInput
ãã³ã¬ãŒã¿ãšåãããã«ãå€æŽãã@Input
ããããã£å€ãObservableãšããŠæäŸããããšæããŸãã ç¹ã«æ¢åã®ïŒAngular 1ïŒã¢ããªã±ãŒã·ã§ã³ã移è¡ããå Žåã¯ã芪ã³ã³ããŒãã³ãã«Observablesãæž¡ãããšãåžžã«å¯èœã§ãããšã¯éããŸããã ãã ããåäžã®ã³ã³ããŒãã³ãå
ã«Observableããå«ãããããšãã§ããªããšãRxJSã®ãã¯ãŒãšãšã¬ã¬ã³ã¹ã掻çšããããšãã¯ããã«å°é£ã«ãªããŸãã
æ®å¿µãªãããããã¯ãã®ããŒãžã§ã³ã®@ObserveInput
ã䜿çšããªããšèšã£ããšããåè«ã§ã¯ãããŸãã
@ObserveInput
ããè¯ãå®è£
ã管çãã人ã¯ããŸããããããšãå
¬åŒãµããŒãã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ
@lephyruså
¬åŒã®@ObserveInput
ãã³ã¬ãŒã¿ã¯éåžžã«äŸ¿å©ã§ããã @Input
ããããã£å€ã®å€æŽã®ObservableãååŸããããã«å³å¯ã«å¿
èŠãªããã§ã¯ãããŸããã ãã³ã¬ãŒã¿ã¯ãåã«éåžžã«ãšã¬ã¬ã³ããªãç ç³ãã«ãªããŸãã
ãã§ã«ã©ã€ããµã€ã¯ã«ã€ãã³ãngOnChanges
ãŸãã ngOnChanges
å
ã§ãrxjs Subject
ã䜿çšããŠãç£èŠå¯èœãªå€æŽãäœæã§ããŸãã
<strong i="13">@Input</strong> inputString: string;
private Subject<string> inputString$ = new Subject<string>;
ngOnChanges(changes: { [key: string]: SimpleChange }) {
if (changes.hasOwnProperty('inputString')) {
this.inputString$.next(changes['inputString'].currentValue);
}
}
constructor() {
inputString$.subscribe(x => {
console.log('inputString is now', x);
});
}
ãŸãã¯ãããåå©çšå¯èœãªãã®ãå¿
èŠãªå Žåã¯ãã³ã³ããŒãã³ããextends
ãšããåºæ¬ã¯ã©ã¹ãäœæã§ããŸãã
import { SimpleChange } from '@angular/core';
import { Observable, ConnectableObservable, Observer } from 'rxjs';
export interface TypedSimpleChange<T> {
previousValue: T;
currentValue: T;
}
export class ReactiveComponent {
private changesObserver: Observer<{ [key: string]: SimpleChange }>;
private changes$: ConnectableObservable<{ [key: string]: SimpleChange }>;
constructor() {
this.changes$ = Observable.create((observer: Observer<{ [key: string]: SimpleChange }>) => this.changesObserver = observer).publishReplay(1);
this.changes$.connect();
}
public observeProperty<T>(propertyName: string): Observable<TypedSimpleChange<T>> {
return this.changes$
.filter(changes => changes.hasOwnProperty(propertyName))
.map(changes => changes[propertyName]);
}
public observePropertyCurrentValue<T>(propertyName: string): Observable<T> {
return this.observeProperty<T>(propertyName)
.map(change => change.currentValue);
}
ngOnChanges(changes: { [key: string]: SimpleChange }) {
this.changesObserver.next(changes);
}
}
...次ã®ããã«äœ¿çšã§ããŸãïŒ
@Component({
...
})
export class YourComponent extends ReactiveComponent {
@Input() inputString: string;
constructor() {
super();
this.observePropertyCurrentValue<string>('inputString')
.subscribe(x => console.log('inputString is now', x));
}
}
å
¬åŒã®@ObserveInput
ãã³ã¬ãŒã¿ãå©çšå¯èœã«ãªããŸã§ããã®ã¢ãããŒãã䜿çšããŠããŸãã
ããããšãã@ wmaurerã ããªãã®ReactiveComponent
ã¯å€§æè¿ã§ãããããŠéã®æã¡ã©ããã®ãªãã³ãŒããšå®å
šãªã¿ã€ãã³ã°ã䜿ã£ãŠèµ·åããŸã-æ¬åœã«çŽ æŽãããã§ãïŒ éèŠãªã®ã¯ããã¹ãäžã®åäœãè¯å¥œã§ããã OnPush
å€æŽæ€åºæŠç¥ã䜿çšã§ããããšã§ãã ããªãã£ã·ã£ã«ã·ã¥ã¬ãŒãããåŸ
ã¡ããŠãããŸãã ïŒãŸãã Observable.create()
ããžãã¯ã䜿çšããªããã°ãªããªãã£ãçç±ãç解ãããšãã«äœããåŠã¶ãšç¢ºä¿¡ããŠããŸã-ãŸã 調ã¹ãæéããããŸãããïŒç¹°ãè¿ããŸãããmercigÀllïŒ ïŒãŠã£ã³ã¯ïŒ
@lephyrusã©ãããããŸããŠãgÀrngescheh;-)
ç§ã䜿çšObservable.create()
ã®ããŒã«ããååŸããããã«Observer
è¡ãããšãã§ããããã«ããããã«next()
ã Observable
ãšObserver
äž¡æ¹ã§ããSubject
ã䜿çšããããšãã§ããŸãããã Subject
ïŒ Observer
ïŒã
@ laco0416ã¯https://github.com/angular/angular/issues/13248ãæ¯æããŠçµäºã
@DzmitryShylovichãããããã®å·ã§ææ¡ãããŠããæ©èœã¯ãèªã¿åãå°çšã§ã€ãã³ãé§ååã®ããŒã¿åãæž¡ãã§ãã
@ObserveInput
ã¯ãšãŠãã¯ãŒã«ã«ãªããŸãïŒ ïŒ+1ïŒ
è¯ãäŸãããããšã@wmaurer ã 質åã1ã€ãããŸãã æååã®ä»£ããã«ãªããžã§ã¯ãããªãã¶ãŒããã«ãšããŠäœ¿çšã§ããããã«ããããšæããŸãã
äŸãã°
@Input() chartConfig: ChartConfig;
constructor(private _reportService: ReportService) {
super();
this.observePropertyCurrentValue<string>('chartConfig')
.subscribe(changedConfig => this.updateChart(changedConfig));
}
export class ChartConfig {
public id: string;
public type: any;
public data: any;
public labels: any;
}
ãã ããthis.updateChartãšngOnChangesã¯åŒã³åºãããŸããã åçŽãªæååãããµã³ãã«ãæ¡åŒµããŠã代ããã«ãªããžã§ã¯ãã芳å¯ããã«ã¯ã©ãããã°ããã§ããïŒ
@ChrisWorksã¯ããªããžã§ã¯ãã§ã
this.observePropertyCurrentValue<ChartConfig>('chartConfig')
.subscribe(changedConfig => console.log(changedConfig));
ç§ã¯ãããé »ç¹ã«è¡ãã®ã§ããããæ©èœããªãå Žåã¯ãã³ã³ããŒãã³ããžã®å ¥åã«åé¡ããããšæããŸãã
ããã«ã¡ã¯@wmaurer ãè¿ä¿¡ããããšã
@ChrisWorksã¯ãå®éã«ã¯ãã®ãŸãŸobservePropertyCurrentValue
ã¯ãæååå
¥åãšãªããžã§ã¯ããåºå¥ããŸããã
ããã¯ç§ãäœæããéåžžã«å€ãng2ããŒã¿0ãããžã§ã¯ãã§ãå
¥åã¯æååã ãã§ãªãããã¹ãŠã®ç°ãªãã¿ã€ãã§ãã
https://github.com/wmaurer/todomvc-ng2-reactive
äŸïŒ https ïŒ
+1ãã®ãããªåºæ¬çãªãŠãŒã¹ã±ãŒã¹ã¯ããŸã 䞊ã¹æ¿ããããŠããªãããšãä¿¡ããããŸããã
ç§ã¯ã€ãã«æè¯ã®è§£æ±ºçãæã«å
¥ããŸãããããã¯ç¹°ãè¿ããªãã§AOTã³ã³ãã€ã«ã§æ©èœããŸã:)ç§å¯ã¯@Input()
ã2çªç®ã®ãã³ã¬ãŒã¿ãšçµã¿åãããããšã§ãã
ãã³ã¬ãŒã¿ïŒ
import { ReplaySubject } from 'rxjs/ReplaySubject'
const subjects = new WeakMap()
export function ObservableInput() {
return (target, propertyKey) => {
delete target[propertyKey]
Object.defineProperty(target, propertyKey, {
set(value) {
this[propertyKey].next(value)
},
get() {
let subject = subjects.get(this)
if (! subject) {
subject = new ReplaySubject<any>(1)
subjects.set(this, subject)
}
return subject
},
})
}
}
䜿çšæ³ïŒ
class SomeComponent {
@Input() @ObservableInput()
public index: Observable<number>
}
ç·šéïŒç§ã¯ä»ãããã©ã€ãã©ãªã«ããŸããã ãããæ¹åããããã®ã¢ã€ãã¢ãåãã§åãåããŸãã æ¢åã®@Input
ã次ã®Observable
ã§è£å®ããæ°ããã¡ãœãããè¿œå ããŸãã https://github.com/ohjames/observable-inputãåç
§ããŠ
ãã®ãããªããšãããªããã°ãªããªãå Žåã¯ãngOnChangesã«é¡äŒŒããåäžã®ãµããžã§ã¯ãã䜿çšããããšæããŸãïŒ Subject<SimpleChanges>
å¿
èŠã«å¿ããŠãç¹å®ã®1ã€ã®å
¥åã®ã¿ããã£ã«ã¿ãªã³ã°ããŠãããã³ã°ããããšãã§ããŸãã
ã²ãã¿ãŒãšã»ãã¿ãŒãäœæããããã«ã¯ã©ã¹ãããããåé€ããããšã«ã€ããŠè©±ããã«ãå
¥åããšã«1件ã®ä»¶åãå€ãããã§ããå
¥åã®ã¿ã€ããééã£ãŠããã input = value
ãããšãå®éã«ã¯ãªãã¶ãŒããã«ã«å€ãåºåãããŸãããããã§ã¯ãããŸãããããªãã®äž»é¡ãå®äºããã
ç§ã®ã¢ã€ãã¢ã®å®è£ äŸã¯ããã«ãããŸãããã³ã¬ãŒã¿ã¢ãããŒãã¯å®éšçãªãã®ã§ãããç¶æ¿ã¢ãããŒãã䜿çšããã®ã¯ããªãå®å šã ãšæããŸãïŒããã«ç€ºãããã«ä»è¡ã£ãã ãã§ã䜿çšãããŠããªãããšã«æ³šæããŠãã ããïŒã
@ghetolayãµããžã§ã¯ããå®äºãããã©ããã¯é¢ä¿ãããŸããããã¥ãŒãéãããšãã¹ããªãŒã ãžã®ãµãã¹ã¯ãªãã·ã§ã³ã¯ãªããªããGCã§
changes$
ã¯ã BehaviorSubject
ã€ã³ã¿ãŒãã§ã€ã¹ãã³ã³ããŒãã³ãã«ãªãŒã¯ããŸããçæ³çã«ã¯ã Observable<...>
ãšããŠå
¥åããå¿
èŠããããŸãããã以å€ã¯ãããå°ãåé·ã§ããã°ãåççãšæãããŸãã
å€ãã®ãµããžã§ã¯ãã®åé¡ã«ã€ããŠã¯... n
ãµããžã§ã¯ãã䜿çšããŠããå Žåã§ã1
ã䜿çšããŠããå Žåã§ãã n
ãµãã¹ã¯ãªãã·ã§ã³ããããŸãã ãµããžã§ã¯ãã1ã€ããå Žåãåãµãã¹ã¯ãªãã·ã§ã³ã«1ã€ã®ããããªãã¬ãŒã¿ãŒãš1ã€ã®ãã£ã«ã¿ãŒãªãã¬ãŒã¿ãŒãè¿œå ããããšã«ãªããŸããããã®ããã©ãŒãã³ã¹ãªãŒããŒãããã¯ã n
ãµããžã§ã¯ãã䜿çšããå Žåãããã¯ããã«å°ãªããªãããšã¯ãªããããã«æªåããå¯èœæ§ããããŸãã
å
¥åãã©ã¡ãŒã¿ãŒèªäœã®å
¥åãç¡èŠããŠããã³ã¬ãŒã¿ãŒããŒã¹ã®ããŒãžã§ã³ã¯ã any
åºã¥ãSimpleChange
ã¿ã€ããããããªãã¶ãŒããã«ã®ã³ã³ã·ã¥ãŒããŒã«ã¿ã€ãã»ãŒããªAPIãæäŸããŸãã
@ohjames
ãã¥ãŒãéãããããšãã¹ããªãŒã ãžã®ãµãã¹ã¯ãªãã·ã§ã³ã¯ãªããªããGCã§ç Žæ£ã§ããŸãã
ãã¹ãŠã®ãµãã¹ã¯ãªãã·ã§ã³ããã¥ãŒã«é¢é£ä»ãããããã¥ãŒãšåãã©ã€ããµã€ã¯ã«ãååŸãããšæ³å®ããŠããŸãã Observableãã©ã®ããã«æ¶è²»ããããã«ã€ããŠã¯äœãæ³å®ããŠããŸããã
åºæ¬çã«ããªãã¶ãŒããã«ã«å€ãåºåããããšããã®ãã€ã³ãã§ãã Angularã³ã³ãã€ã©ã¯çŸåšãå ¥åããããã£ã¿ã€ãããã§ãã¯ããŠããŸãããããŸãããã°ããããå®è¡ãããŸã§ã«ãããå ¬åŒãªãã®ãå©çšå¯èœã«ãªãã§ããã;ïŒ
ç§ã¯ãŠãŒã¶ãŒã察象ãšããŠããŸãããããŠãŒã¶ãŒã¯åŒãç¶ãããããã£ã«ã¢ã¯ã»ã¹ããŠèšå®ã§ããŸãã ãããã£ãŠãObservableãšããŠå ¥åãããŠããããšãé€ããŠãããããã£ãæ°å€ã§ãããã®ããã«èšå®ããŸããããã«ãããããããã£ãèšå®ãããããšã¯ãªããåºåãããŸãã ããã¯ç§ã«ãšã£ãŠéåžžã«æ··ä¹±ããŠããŸãã
å€ãã®ãµããžã§ã¯ãã®åé¡ã«ã€ããŠã¯... nåã®ãµããžã§ã¯ãã䜿çšããŠããã1åã䜿çšããŠãããã«ãããããããŸã nåã®ãµãã¹ã¯ãªãã·ã§ã³ããããŸãã ãµããžã§ã¯ãã1ã€ããå Žåãåãµãã¹ã¯ãªãã·ã§ã³ã«1ã€ã®ãããæŒç®åãš1ã€ã®ãã£ã«ã¿ãŒæŒç®åãè¿œå ããããšã«ãªããŸããããã«ããããã©ãŒãã³ã¹ã®ãªãŒããŒãããã¯ãnåã®ãµããžã§ã¯ãã䜿çšããå Žåãããã¯ããã«å°ãªããªãããšã¯ãªããããã«æªåããå¯èœæ§ããããŸãã
ç§ãã¡ã¯ããã«äž»ãªç®çã«ã€ããŠã®çŠç¹ã倱ãã®ã§ãããã§ã¯ãã®çš®ã®è°è«ã«ã¯ç«ã¡å ¥ããŸããã
Subject
ãå
¬ââéããªãããã«æŽæ°ããå€æŽã«å
¥åãè¿œå ããããã«äœããæ§ç¯ããŸããã
ç§ã¯ BehaviorSubject
ã䜿çšããŠããŸããããåçŽãªSubject
ã䜿çšããŠããŸããããã¯ããããã®Observableãå€ã®ææè
ãšããŠã§ã¯ãªããæéã®çµéãšãšãã«å€åãããã®ãšèŠãªããŠããããã§ãã
ç§ã¯ã¡ããã©æ¬ é¥ãèŠã€ããŸããïŒéåæãã€ãã䜿çšãããšããéåæãã€ãã¯æåã®æŸåºã®åŸã«ãµãã¹ã¯ã©ã€ãããã®ã§ãæåã®å€ã¯æŸåºãããŸããã ãã®å Žåãé©åã«åŠçããããã«ãåŸã§ã³ãŒããæŽæ°ããŸãã
ããã«åã³ãªã³ã¯ããããŸãïŒ //stackblitz.com/edit/angular-observableinputïŒfile = observablechangesïŒ 2Fimpl.ts
ãã¹ãŠã®ãµãã¹ã¯ãªãã·ã§ã³ããã¥ãŒã«é¢é£ä»ãããããã¥ãŒãšåãã©ã€ããµã€ã¯ã«ãååŸãããšæ³å®ããŠããŸãã Observableãã©ã®ããã«æ¶è²»ããããã«ã€ããŠã¯äœãæ³å®ããŠããŸããã
ããããŸããããªãã¶ãŒããã«ãå®äºãããšããã¹ãŠã®ãµãã¹ã¯ãªãã·ã§ã³ã匷å¶çã«éããããŸãããããã¯ç§ãæ¬åœã«å¿é ããŠããããšã§ã¯ãããŸããã ç§ãã¡ã®ã¢ããªã§ã¯ããµãã¹ã¯ãªãã·ã§ã³ã®99ïŒ ãéåæãã€ããä»ããŠçºçããReduxãªã©ããcombineLatest / switchMapãä»ããŠäŸçµŠãããå€éšãªãã¶ãŒããã«ããœãŒã¹ãšããããšãå€ããããæåã§éããå¿ èŠããªããã®ããããŸãã
ç§ãã¡ã¯ããã«äž»ãªç®çã«ã€ããŠã®çŠç¹ã倱ãã®ã§ãããã§ã¯ãã®çš®ã®è°è«ã«ã¯ç«ã¡å ¥ããŸããã
ããŠãããªãã¯ç¡å¹ãªæ¹å€ãæèµ·ããã®ã§ãããã«å¯Ÿæããå¿ èŠããããŸããã
ãç¶æ¿ã«ããã¯ã©ã¹ã®äœ¿çšãæ©èœããŸãããAOTã³ã³ãã€ã©ã«ãã£ãŠçæãããã³ãŒãã¯ã芪ã¯ã©ã¹ã®ã©ã€ããµã€ã¯ã«ã¡ãœãããåŒã³åºããŸãããhttpsïŒ //github.com/angular/angular/issues/12756#issuecomment-260804139ãåç
§ããŠngOnDestroy() { super.ngOnDestroy() }
ãšngOnChanges
å¥ã®ãã®ãè¿œå ããå¿
èŠããããŸããã <-Angular 4.4以éãç¹å®ã®å¶éä»ãã§ä¿®æ£ãããŠããããã§ãã
éåæãã€ãã®äœ¿çšã«é¢ããæžå¿µäºé
ã確èªããŸãããããŸã å
¥åã«ã¢ã¯ã»ã¹ã§ããããã䜿çšæ³ã«æå³ããªããšæããŸãã ãã³ãã¬ãŒãã®å
¥åå€ããã€ã³ãããã ãã®å Žåã¯ãå
¥åã«çŽæ¥ãã€ã³ãããã ãã§ãããã§ç£èŠå¯èœã§éåæã䜿çšããå¿
èŠã¯ãããŸããã ããããæ°ãããªãã¶ãŒããã«ãäœæãããå Žåã¯ãå¿
èŠãªãã®ãç°¡åã«æ£ç¢ºã«ååŸã§ããã¯ãã§ãïŒãããããã©ããã§startWith
ã䜿çšããŸãïŒã
ã ããç§ã¯ç§ã®åã®ã¹ããŒãã¡ã³ãã¯å€§äžå€«ã ãšæããŸãïŒ
ç§ã¯BehaviorSubjectã䜿çšããŠããŸãããããã¬ãŒã³ãªSubjectã䜿çšããŠããŸããããã¯ããããã®Observableãå€ã®ææè ãšããŠã§ã¯ãªããæéã®çµéãšãšãã«å€åãããã®ãšèŠãªããŠããããã§ãã å ¥åå€ã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã§ããããããã£ã¯åŒãç¶ãååšããåæçã«åç §ã§ããŸãã
ãã®ã³ãŒãã¯éåžžã«å®éšçãªãã®ã§ãããäžçš®ã®æŠå¿µå®èšŒã§ãããç§ã¯ãã®ã¹ã¿ãã¯ããªããã§ã®ã¿éãã ããšããããŸãã
ã§ããããç³ãèš³ãããŸããããããªãå®å
šã ãšèšãã¹ãã§ã¯ãããŸããã§ãããããªããè¿°ã¹ãããã«ãAOTã§ã¯æ©èœããªãå¯èœæ§ããããŸãã
è©ŠããŠã¿ããšãããã©ã¡ãã®ã¢ãããŒããçŸåšAOTïŒangular v4.3.6ãcli v1.4.1ïŒã§æ©èœããŸãã
ããã§ã®ç§ã®äž»ãªãã€ã³ãã¯ããã¹ãŠã®å
¥åã®å€æŽãå«ãchanges
ãªãã¶ãŒããã«ãã移åãããšãæŒç®åã䜿çšããŠå¿
èŠãªããšããã¹ãŠå®è¡ã§ããããã«ãªãããšã§ããå
¥åãå€æŽããããšãã1ã€ã®å
¥åã ããå€æŽããããšããä»»æã®æ°ã®å
¥åãå€æŽããããšãã«åå¿ããŸããç¹å®ã®å€ããå¥ã®å€ã«å€æŽããããšããªã©ã«å€æŽãããŸããã
å¿
èŠãªãªãã¶ãŒããã«ãäœæã§ããŸãã
ãŸããå®è£ ã®ããã«ç®¡çãããµããžã§ã¯ãã¯1ã€ã ãã§ããããŠãŒã¶ãŒã«äœ¿çšããããããã£ã¯1ã€ã§ããã®ã«å¯Ÿããå ¥åããšã«1ã€ã§ãã
ç§ãå€æŽã§ããã®ã¯ã SimpleChanges
ãªããžã§ã¯ãã§ã¯ãªããæ°ããå€ãåºåããããšã§ãããŠãŒã¶ãŒã¯ããããpair
ãšmap
ã䜿çšããŠã SimpleChange
ãšåãçš®é¡ã®æ§é ãååŸã§ããããã§ãã SimpleChanges
ãªã®ã§ãåŸã§äŒŒããããªãã®ãåæ§æããããã ãã«ãããå解ããã®ã¯ã°ãããŠããŸãã
PSïŒ
ããŠãããªãã¯ç¡å¹ãªæ¹å€ãæèµ·ããã®ã§ãããã«å¯Ÿæããå¿ èŠããããŸããã
ããªãã«ã¯ç¡å¹ã§ãã
ããã©ãŒãã³ã¹ã«ã€ããŠèšåãããšããããã¯å人çãªèŠè§£ã§ã¯ãããŸããããããã¯å®¢èŠ³çãªæž¬å®å¯èœãªäºå®ã§ãã 3ã€ã®ãµããžã§ã¯ãã¯ã6ã€ã®è¿œå ã®ãªãã¬ãŒã¿ãŒããããªãŒããŒãããã倧ãããšæããŸãã確ãã«æ£ãããããããŸãããã枬å®ãè¡ããŸã§ããããä¿¡ããåççãªæ ¹æ ã¯ãããŸããã
å€ãã®å ¥åã«åå¿ããããšã«é¢ããŠã¯... switchMapãŸãã¯combineLatestããããã¯è€æ°ã®ãªãã¶ãŒããã«ãæäœããããã«èšèšãããä»ã®æŒç®åã®ããããã䜿çšã§ããããšã確èªããŠãã ããã ããªãã¯ããã«ã€ããŠéåžžã«å€§èã§ææ¬çãªçºèšãããŠããŸããæ¬åœã«ãã®äŒè©±ãç¶ãããã®ã§ããã°ããã®åé¡è¿œè·¡ã·ã¹ãã ãããããå€ããŸãããã
ããŸããŸãªæ¬ ç¹ãšå©ç¹ãããããŒãžã§ã³ããããŸãããåºæ¬ã¯ã©ã¹ãå¿ èŠã§ãã
import { OnChanges, OnDestroy, SimpleChanges } from '@angular/core'
import { BehaviorSubject } from 'rxjs/BehaviorSubject'
import { Observable } from 'rxjs/Observable'
import 'rxjs/add/operator/map'
import 'rxjs/add/operator/distinctUntilChanged'
export class ChangeObserver implements OnChanges, OnDestroy {
protected ngChanges = new BehaviorSubject<object>({})
ngOnChanges(changes: SimpleChanges) {
const props = { ...this.ngChanges.value }
for (const propName in changes) {
props[propName] = changes[propName].currentValue
}
this.ngChanges.next(props)
}
ngOnDestroy() {
this.ngChanges.complete()
}
changes<K extends keyof this>(key: K): Observable<this[K]>
changes<V>(key: string): Observable<V>
changes(key: string) {
return this.ngChanges.map(props => this.ngChanges.value[key]).distinctUntilChanged()
}
}
ããã³äœ¿çšããïŒ
class MyComponent extends ChangeObserver {
@Input() public field: string
// typescript knows this is Observable<string>
field$ = this.changes('field')
@Input() private privField: number
// typescript can't access private stuff from outside the class so we need to help it out
privField$ = this.changes<number>('privField')
}
åé¡ã誀解ãããã©ããã¯ããããŸããããéåæãã€ãã¯ãã®åé¡ã解決ããŸãããïŒ
[inputVar]="observableValue | async"
..
@najibla誀解ããŸããããå ¥åã¯
@ohjamesã¯ç§ã®å Žåã¯ããŸããããŸãããã
@najiblaãã®githubã®åé¡ã¯ã @Input
ããããã£ããªãã¶ãŒããã«ã«å€æããããšã«é¢ãããã®ã§ããããã¯ã説æããŠããã±ãŒã¹ãšå¯æ¥ã«é¢é£ããŠããŸãã
ã€ãŸãããã¥ãŒã§å ¥åããããã£ããªãã¶ãŒããã«ã«å€æããå¿ èŠã¯ãããŸãããã³ã³ããŒãã³ãããªãã¶ãŒããã«ã䜿çšããŠå€åããå ¥åããããã£ã«å¿çãããã©ããã¯ãã³ã³ããŒãã³ãèªäœã§åé¢ããå¿ èŠããããŸãã ãã以å€ã®å ŽåãAngularã®éåžžã®ããªãã¶ãŒããã«ãã¡ãŒã¹ããã¢ãããŒããšå¯Ÿç«ãããªãã¶ãŒããã«ãšããŠããããã£ã䜿çšããããšã«ããå Žåã¯ãã³ã³ããŒãã³ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå€æŽããå¿ èŠããããŸãã
@icepengå®éãããªãã¯ããã
<app-child [prop]="prop$ | async"></app-child>
...次ã«ã AppChildComponent
prop
å
ã®AppChildComponent
ã«ããªãã¶ãŒããã«ã§ã¯ãªãå Žåã§ããªãã¶ãŒããã«ãšããŠã¢ã¯ã»ã¹ããæ¹æ³ãæäŸããŸãïŒãŸãã¯ããªãã¶ãŒããã«ã®å Žåã¯ããªãã¶ãŒããã«ã®ãªãã¶ãŒããã«ãååŸããŸãïŒã ãã¡ãããäŸã®ããã«æåã«prop$
ããã£ãå Žåãããã¯è³¢æã§ã¯ãªãããã«æããããããããŸããïŒãã§ã«ãå
¥åã䜿çšããŠobservableãæž¡ãããšãã§ããŸãïŒã ãã ããæž¡ãããå
¥åããŸã ç£èŠå¯èœã§ãªãå ŽåïŒããšãã°ã index
ããã®ngFor
ïŒãå€ãã®äŸ¡å€ãæäŸãããŸãã
å
¥åã§ãªãã¶ãŒããã«ãæž¡ãéã®åé¡ïŒããã¯çŸåšå®å
šã«å¯èœã§ãïŒã¯ã OnPush
ã§ã¯å®å
šã«æ©èœããªãããšã§ãã
@fxck確ãã«ããªãã¶ãŒããã«ãngOnChanges
ã¯åŒã³åºãããŸããïŒå
¥åãåããŸãŸã§ããããïŒããéåæãã€ãã䜿çšããŠ@Input
ééãããªãã¶ãŒããã«ããµãã¹ã¯ã©ã€ãããéãOnPush
ã¯ãéåæãã€ããåã³ã³ããŒãã³ãã®å€æŽæ€åºåšãæåã§ããªã¬ãŒãããããæ£åžžã«æ©èœããŸãã
ã¯ãã@ icepengã«åããããŸããã
@ohjames @fxckæ å ±ãééã£ãŠããŠç³ãèš³ãããŸããããçŸæç¹ã§observableãæž¡ãããšãå¯èœãã©ããã¯ããããŸããã§ããã
observableãçŽæ¥æž¡ãããšãå¯èœã§ããããã @ObserveInput
ã圹ç«ã€ãã©ããã¯ããããŸããã
å€æŽã§ããå€ãObservableã§ãªããã°ããã§ã«åé¡ã ãšæããŸãã
å人çãªæèŠã§ãã
@icepengãããèæ ®ããŠãã ããïŒ
<ng-container *ngFor="value in (values$ | async); let i = index">
<child-component [value]="value" [index]="i"></child-component>
</ng-container>
ããŒããé£ã³è¶ããã«ãããã§ãªãã¶ãŒããã«ãšããŠindex
æ¶è²»å¯èœã«ããæ¹æ³ã¯ïŒ
ãŸãã¯ããµãŒãããŒãã£ã®ã©ã€ãã©ãªãäœæããŠããŠãã©ã€ãã©ãªã®ã³ã³ã·ã¥ãŒããŒã«ãªãã¶ãŒããã«ãã³ã³ããŒãã³ãã«æž¡ãããããªãå ŽåãèããŠãã ããïŒå€ãã®ãŠãŒã¶ãŒã¯ã¹ããªãŒã ã«æ £ããŠããããrxjsãé¿ããŠããŸãïŒã
ããã圹ç«ã€äŸã¯ä»ã«ããããããããŸãã
@ohjames index
ã¯ãåchild-component
éçãªå€ã«ãªããããç£èŠå¯èœã§ããå¿
èŠã¯ãªããšæããŸãã ããããä»ã§ã¯äººã
ããã®æ©èœãæãã§ããçç±ãããããŸããã ãããŠãããªãã®ãœãªã¥ãŒã·ã§ã³ã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãæžãã®ã«é©ããŠããããã§ãã
BehaviorSubject
ã¢ãããŒãã®æ¹ãè¯ãããã§ãããAngularã³ã¢ããã®ãããª@NgChanges()
ãã³ã¬ãŒã¿ãæäŸããã®ã§ããã°ããã§ãããã
{
@NgChanges() ngChanges$: BehaviorSubject<{ prop: string }>
@Input() prop: string;
ngOnInit() {
this.ngChanges$.subscribe(changes => console.log(changes.prop));
}
}
ãããå®è£ ããããšã¯å¯èœã§ããïŒ
ãããã¡é·ã1ã®ReplayObservableãæãŸããã§ããããããã£ã«ã¢ã¯ã»ã¹ã§ããå Žåã¯ãBehaviourSubjectã®å€ã»ãã³ãã£ã¯ã¹ã¯å¿ èŠãããŸããã
å®è£ ãå¯èœãã©ããã«ã€ããŠã¯ãããŸããŸãªå®è£ ãšãªãã·ã§ã³ã®åé¡å±¥æŽã確èªããŠãã ããã çŽ æŽããããã®ã¯ãªããå®å šã«å£ããŠãããã®ããããŸãããããé©åã«è¡ãã«ã¯ããªã³ã¯ãããPRãªã©ãå¿ èŠã§ãã
ç§ã®2ã»ã³ãïŒobject.observeããããã·ãåªå ããŠæžäŸ¡ååŽããããããç§ã®è§£æ±ºçã¯ãããã·ãæ¡åŒµãïŒã¯ããããããŸãããã³ã³ã¹ãã©ã¯ã¿ããè¿ãããçç±ïŒãããã«å±ããããŒããªãã¹ã³ããããšã§ããã $ getïŒkeyNameïŒã¡ãœãããä»ããObservableãšããŠã®ãªããžã§ã¯ãã è§åºŠã¯ã©ã¹1ã ãã§ãªããä»»æã®ãªããžã§ã¯ãã§äœ¿çšã§ããŸãã
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
/**
* Extends this class to be able to observe any key affectation
*/
class ObservableProxy {
private changes: Subject<[PropertyKey, any]> = new Subject<[PropertyKey, any]>();
constructor() {
return new Proxy(this, {
set: (object, key, value) => {
this.changes.next([key, value]);
object[key] = value;
return true;
}
});
}
public $get<K extends keyof this>(key: K): Observable<this[K]> {
const value: this[K] = this[key];
const startWith: Observable<this[K]> = Observable.of(value)
.filter((initialValue) => // remove this filter if you dont mind receiving an undefined value on subscription
initialValue !== undefined;
);
return this.changes
.filter(([changedKey]) => {
return changedKey === key;
})
.map(([changedKey, nextValue]) => nextValue)
.merge(startWith);
}
}
äŸïŒ
class User extends ObservableProxy {
public name: string;
}
const user: User = new User();
user.$get("name").subscribe((value)=> {
console.log(value);
})
user.name = "toto"; // prints console.log("toto")
@robwormald ããã®åé¡ã«äœãçœåŒåã¯ãããŸããïŒ ããã¯ç¢ºãã«ç©äºã䜿ããããããã®ã«å€§ãã«åœ¹ç«ã€ã§ãããã
@bryanridesharkããããµããŒããããå¯èœæ§ãæãé«ãã®ã¯ã httpsïŒ //github.com/angular/angular/issues/10185ã§ããPRããã®åé¡ã«ãªã³ã¯ãããŠããªãããšã«é©ããŠããŸãã
ããã¯ãã¢ã€ããŒãåºè·ãããŸã§çºçããŸãã
7:56ãžã§ãŒã ãºã»ãã€ã¯ã®æ°Žã2018幎2æ21æ¥ã«[email protected]æžããŸããïŒ
@bryanridesharkhttps ïŒ//github.com/bryanridesharkã®æé«ã®ãã£ã³ã¹
ããã¯ïŒ10185ãä»ããŠãµããŒããããŠããŸã
https://github.com/angular/angular/issues/10185ç§ã¯ãé©ãããšæããŸã
PRã¯ãã®åé¡ã«ãªã³ã¯ãããŠããŸãããâ
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/angular/angular/issues/5689#issuecomment-367372931 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AAgpkvtGA4w8uHgiz0QsdYwBgqgM2EpAks5tXDyWgaJpZM4Gwr8f
ã
ããªãã®è±èªã¯çŽ æŽããããããªãã®è§åºŠã¯ãã倧ãããªã£ãŠããŸãã
@ pldin601ã䜿ãã®ã¡ãœããã¯AOTã³ã³ãã€ã«æžã¿ã³ãŒãããµããŒãããŠããªããããã»ãšãã©ã®äººã®æ¬çªã³ãŒãã§å€§éã®ã¡ã¢ãªãªãŒã¯ãçºçããŸãã 代ããã«ãAOTã§ããŸãæ©èœããç§ã®observable-input
ããã±ãŒãžããã§ãã¯ããŠãã ããã
@ pldin601ã³ãŒãã®åé¡ã¯ã ngOnDestroy
ã©ã€ããµã€ã¯ã«ã¡ãœãããåçã«è¿œå ããããšã§ãã AOTã§ã³ã³ãã€ã«ãããã³ãŒãã¯ãã³ã³ãã€ã©ãéçã«ãã®ååšãæšæž¬ã§ããå Žåã«ã®ã¿ngOnDestroy
åŒã³åºããŸãã ãããã£ãŠããã®ã¡ãœããã¯ããã³ã¬ãŒã¿ã䜿çšãããã¹ãŠã®ã³ã³ããŒãã³ããngOnDestory
ãå®çŸ©ããŠããå Žåã«ã®ã¿æ©èœããŸãïŒäžèŠãªå Žåã¯ç©ºã«ããããšãã§ããŸãïŒã ä»ã®ãã¹ãŠã®å Žåããµãã¹ã¯ãªãã·ã§ã³ããªãŒã¯ããã³ã³ããŒãã³ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã®ãé²ããŸãã
ç§ã¯ãããã»ã¯ã·ã§ã³3.2ãå®äºããåŸã«èµ·ãããšæããŸãïŒãããŠããŸãããã°ãã®å¿
èŠæ§ãèæ
®ãããŸãïŒïŒ
https://is-angular-ivy-ready.firebaseapp.com/#/status
Ivyã¯7.0.0ã®äžéšã«ãªããŸããïŒ
ããããã£ãç£èŠå¯èœãªã³ã³ãããªã³ããããã£ã«ãã€ã³ãã§ãããã³ã¬ãŒã¿ãå®è£
ããŸããã è§åºŠå
¥åããããã£ã ãã§ãªããä»ã®ããããã£ã«ã䜿çšã§ããŸãã ããã¯@ohjamesã®@ObservableInput()
ãã³ã¬ãŒã¿ã«è§ŠçºãããŠããŸãããå¥ã®ããããã£ã䜿çšããŠObservableãæäŸããããšã«ãããããããã£ã²ãã¿ãŒãšã»ãã¿ãŒã®éã®ã¿ã€ãã®äžäžèŽã«ãã£ãŠåŒãèµ·ããããå¯èœæ§ã®ããåé¡ãåé¿ããŸãã
https://github.com/PSanetra/bind-observable
äŸïŒ
class MyClass {
@BindObservable()
public myProp: string = 'initialValue';
public myProp$!: Observable<string>;
}
const myInstance = new MyClass();
myInstance.myProp$.subscribe(console.log);
myInstance.myProp = 'newValue'
ãã®ã³ãŒãã¯ãå€'initialValue'
ãš'newValue'
ãã³ã³ãœãŒã«ã«åºåããŸãã
ãããŸã§ã®ãšãããããããã€ãªãªãŒã¹ããããã«ã€ããŠã®æŽæ°ã¯ã observable-input
ããã±ãŒãžã¯ãäœãå£ããããµãã¯ã©ã¹åãè¡ããã«ãæããšã¬ã¬ã³ããªããã«èŠããŸãã @ohjamesãã®æç¹ã§ãããã¯ã©ã®çšåºŠå®å®ããŠããããååã«ãã¹ããããŠããŸããïŒ
å ¬åŒãµããŒãã¯ããæçããããŒãžã§ã³éã§ã®ç¶ç¶çãªãµããŒããšããã¹ã ãŒãºãªéçºãšã¯ã¹ããªãšã³ã¹ãä¿èšŒããéçºè ãå®å šãªrxjs *ã«ç§»è¡ããããã·ã¥å€æŽæ€åºã§æé©åããããšã奚å±ãããšæããŸãïŒããã¯ç§ã®æèŠã®ã³ã¢ãšãªãç»æçãªæ©èœã§ãïŒ
*芳å¯äžå¯èœãªå ¥åãšã®äºææ§ãæãªãããšãªãããŸãã¯ãã€ããªããå ¥åçšã®è¿œå ã®ãã€ã©ãŒãã¬ãŒããå¿ èŠãšããã«ãããªãã¡ïŒã»ãã¿ãŒã件åã§æ¬¡ã«åŒã³åºã
aotã®æç¡ã«ããããããè§åºŠ4ã5ãããã³7ã§ç£èŠå¯èœãªå ¥åã䜿çšããŸããã ããã¯ããŸãããããã§ãã ç§ããããæžãããšããç§ã¯èªåãäœãããŠããããæŒ ç¶ãšç¥ã£ãŠãããšç¢ºä¿¡ããŠããŸãã
圌ããããããã¬ãŒã ã¯ãŒã¯ã«è¿œå ãããã®äœ¿çšã奚å±ããããšãé¡ã£ãŠããŸã2é±éã®ããŠã³ããŒãnpmã¯ãxDãæäŸããå©ç¹ãšæ¯èŒããŠãååã§ã¯ãããŸããã
ãŠãŒã¶ãŒå®çŸ©ã®observer
ã䜿çšããéåæå
¥åçšã«æ¬¡ã®APIãææ¡ããŸã
decalre function AsyncInput(bindName?:string) : <T extends Observer>(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<T>) => any
ãŠãŒã¶ãŒã¯ããã次ã®ããã«äœ¿çšã§ããŸã
@AsyncInput()
asynchronusProperty1 = new Subject();
@AsyncInput()
asynchronusProperty2 = new ReplySubject(1);
@AsyncInput()
asynchronusProperty3 = new UserObserver(); // where UserObserver implement `Observer` interface
Angular internalã¯ãå€ãå€æŽããããã³ã«observer.next(newValue)
åŒã³åºãããšãã§ããŸãã
@HostBinding
ãµããŒããå¿ããªãã§ãã ããïŒ
ãããã³ã³ã¹ãã©ã¯ã¿ãŒ@Inputã€ã³ãžã§ã¯ã·ã§ã³ãšçµã¿åãããŠãããã«ãã°ããããã®ã«ããå¿ èŠããããŸãã ãã®ããã«ããŠããstrictPropertyInitializationããéåžžã«ãšã¬ã¬ã³ããªæ¹æ³ã§ä¿®æ£ã§ããŸãã
class MyComponent {
inputData$: Observable<Data>;
constant: string;
constructor(
@Input() inputData$: Observable<Data>,
@Input() constantString: string
) {
this.inputData$ = inputData$;
this.constant = constantString;
}
}
@benneqã¯ã次ã®ããã«å°ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
class MyComponent {
constructor(
@Input() private inputData$: Observable<Data>,
@Input() private constantString: string,
) {}
}
@ maxime1992ã¯ãããã ãããªãã¶ãŒããã«ã1ã€ã®ã³ã³ããŒãã³ãããå¥ã®ã³ã³ããŒãã³ãã«æž¡ãããå Žåãåºå¥ããããã«ããªãã¶ãŒããã«ãšããŠã®å ¥åçšã«å¥åã®ãã³ã¬ãŒã¿ãŒãå¿ èŠã§ãã
@benneq @ maxime1992ãã©ã¡ãŒã¿åã¯ãã³ã¬ãŒã¿ã¡ã¿ããŒã¿ã®äžéšã§ã¯ãããŸããããã©ã®ããã«ãããã³ã°ããŸããïŒ
@trotylãããªã@Input('paramName') private myParam: Observable<Data>
䜿ãããšãã§ãããšæããŸã
@ trotyl @ benneqã¯ãç§ã®æªãã æ°ã«ããªãã§ãã ããïŒzipper_mouth_faceïŒ
誰ãããã§ã«ãã®ãœãªã¥ãŒã·ã§ã³ãæçš¿ãããã©ããã¯ããããŸããããããã¯ããªãè¯ãåé¿çã§ã
@ElianCordobaããã¯HTML <input>
ã«é¢ãããã®ã§ã¯ãããŸããã ããã¯è§åºŠã®ãã@Input()
ããã¯å¥ã§ãããåæ§ã«èŠçãªåé¡@ElianCordobaã§ãã https://github.com/angular/angular/issues/13248
ããã¯ç䌌èŠä»¶ã ãšæããŸãã ãŸããå ¥åãã³ã¬ãŒã¿ã¯Observableã¿ã€ãã®å€ãåãå ¥ããããšãã§ããŸãã次ã«ãã³ã³ããŒãã³ããObservableãå ¥åãšããŠå¿ èŠãšããå ŽåãObservableã¿ã€ãã®å€ã«éãã«å€æããã®ã§ã¯ãªãã芳å¯äžå¯èœãªå€ãåãåã£ããšãã«æ瀺çã«ãšã©ãŒãã¹ããŒããå¿ èŠããããŸãã
ããã¯ãJavaScriptã®æé»çãªåå€æãšéåžžã«ãã䌌ãŠããããã°ãåŒãèµ·ããããèŠã€ãããããã®ãé£ããå Žåã§ãæ··ä¹±ããå¯èœæ§ããããŸãã
ããã¯ééã£ãå ¥åãé»ãããããšã§ã¯ãããŸããã ããã¯ãã³ã³ããŒãã³ãéã§å ±éã®ã€ã³ã¿ãŒãã§ãŒã¹ãå ¬éããããšã§ãïŒããã¯èŠ³å¯äžå¯èœãªå ¥åã§ãïŒã ããã«ãããå€ã®äžçã§ã€ã³ã¿ãŒãã§ã€ã¹ãå£ãããšãªããrxæ©èœãèªç±ã«å°å ¥ã§ããŸãã ãã1ã€ã®å©ç¹ã¯ãäž»ã«å¯å€æ§ãšå éšç¶æ ãæã¡äžããããšã§ããããã¯ããã¹ãŠãå ¥åã®å€æã§ããããã®æç¹ä»¥éã®ããã·ã¥å€æŽã®æ€åºãç°¡åã«ãªãããã§ãã
ããã©ãããããªãã¶ãŒããã«ãå¿ èŠãšããã€ã³ã¿ãŒãã§ãŒã¹ãå ¬éãããšãäžæ Œå¥œã«èãããã³ã³ããŒãã³ããç§ã«ã¯å¥åŠã«èããããšèšã£ããšããçç±ã ãã§ã人ã ã«ofïŒvalueïŒãæäŸããããã«åŒ·å¶ããŸãã
ããã«ããµã€ã¬ã³ãå€æã§ã¯ãªããrxjsãä»ããŠå€æŽããµãã¹ã¯ã©ã€ãããããã®APIã§ãã angle.httpãšã«ãŒã¿ãŒããªãã¶ãŒããã«ãæäŸããããšãèãããšãå ¥åå€æŽåŠçãæäŸããªãã®ã¯éåžžã«åä»ã§ãããã³ãŒã«ããã¯ãšRxJã®äžçãçµ±åããã«ã¯ãã€ã©ãŒãã¬ãŒããå€ãããŸãã
äžèšã®å·§åŠãªè§£æ±ºçã®ããã€ãã奜ãã§ã¯ãªããšããããã§ã¯ãããŸãããããæšæºçãªãæ¹æ³ãå°ãåç·šæããã ãã§ãæ確ããäžåšçšãã®æ¬ åŠãšããæ¬åœã®åé¡ã解決ããã®ã«ååãªå ŽåããããŸãã ããã«ãç§ã¯ãŸã ããããã€ãè¡ãããã®ãå ¬åŒã®ãã¢ã€ããŒåŸã®æ¹æ³ãæãã§ããŸãã
@Input('isOuterPanel')
set isOuterPanel(value: CheckoutPanelHeaderSettings)
{
this.inputs.outerPanel$.next(value);
}
@Input('config')
set config(value: CheckoutPanelHeaderSettings)
{
this.inputs.config$.next(value);
}
// observables for <strong i="6">@Inputs</strong>
inputs = {
config$: new BehaviorSubject<CheckoutPanelHeaderSettings>(1),
outerPanel$: new BehaviorSubject<CheckoutPanelHeaderSettings>(1)
};
次ã«ã combineLatest(this.service.magicInput$, this.inputs, config$)......
ãããªãã®ãé
眮ããŠãå
¥åãRxJSãšçµã¿åãããããšãã§ããŸãã
BehaviorSubject
ãŸãã¯ReplaySubject
ãããããæ©èœããŸãã BehaviorSubjectã¯éåžžãããå®å
šã§äºæž¬å¯èœã§ãã
ããã¯ã³ãŒãã®æ確åã«åœ¹ç«ã€ã ãã§ãªãããã¹ãŠã®å
¥åãã°ã«ãŒãåããŠããããã this.inputs.
ãšå
¥åããŠãªãŒãã³ã³ããªãŒããååŸããã ãã§ããçŽç²ãªãç£èŠå¯èœãªå
¥åãç°¡åã«ç¢ºèªã§ããŸãã
ããã§åå®å šæ§ãããã«é²ããããšãã§ããŸãïŒã»ãšãã©ã®å Žåãããã¯æ¥œãã¿ã®ããã§ãïŒã
// define this globally to 'unwrap' a property 'inputs' with an object of ReplaySubject / BehaviorSubject
export type InputTypes<T extends { inputs: { [key: string]: ReplaySubject<any> | BehaviorSubject<any> } }> = {
[P in keyof T['inputs']]: T['inputs'][P] extends Observable<infer X> ? X : unknown;
}
// define a local 'InputType' helper above each component
type InputType = InputTypes<CheckoutSmartHeaderComponent>;
ãã®å Žåã @ Inputããããã£ã®ã¿ã€ããæ瀺çã«æå®ããå¿ èŠã¯ãããŸããã
@Input('config')
set config(value: InputType['config$'])
{
this.inputs.config$.next(value);
}
ã³ã³ããŒãã³ãã«ObservableInputsã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŠã inputs
ããããšãã§ããŸãããããããå°ç¡ãã«ãããšã³ã³ãã€ã«ãããªããããäœæããªãããšã«ããŸããã
@simeylaãã€ã©ãŒãã¬ãŒããå€ãããŸãã
ç§ã¯èªåã®ãã³ã¬ãŒã¿ãããã«çœ®ãããšã«ããŸããã ããã¯ç§ã®æåã®npmããã±ãŒãžãªã®ã§ãäœã足ããªããã®ããããšç¢ºä¿¡ããŠããŸãããããã«ãããŸãïŒ https ïŒ//www.npmjs.com/package/@ng-reactive/async -input
npm install @ng-reactive/async-input --save
import { Component, Input } from '@angular/core';
import { AsyncInput } from '@ng-reactive/async-input';
import { BehaviorSubject } from 'rxjs';
@Component({
selector: 'app-hello',
templateUrl: './hello.component.html',
styleUrls: ['./hello.component.css']
})
export class HelloComponent {
@Input() name: string;
@AsyncInput() name$ = new BehaviorSubject('Default Name');
constructor() {
this.name$.subscribe(name => console.log('from async input', name));
}
}
@ mfp22æ¬åœã«ããã§ãããã®ãããªãã®ãçµã¿èŸŒãŸããŠã¯ãããªãçç±ã¯ããããŸãããåèãŸã§ã«ãããã±ãŒãžã®npmã®githubãªã³ã¯ã¯å€ããªã£ãŠããŸããããã«ç§»åããŸãã
https://github.com/mfp22/async-input/tree/master/projects/async-input
ããã¯ããªãå€ãåé¡ã ãšæããŸãããæ©èœã¯ããªãçŽ æŽããããAngularã§ãããèŠãã®ã¯æ¬åœã«ããããã§ãã
ããã«ã¯ãŒã«ãªã®ã¯ãç£èŠå¯èœãªå
¥åã§ã¯OnChanges
ããã¯ãå¿
èŠãªãããšã§ãã pairwise
rxjsæŒç®åã䜿çšããŠãç£èŠå¯èœãªå
¥åã®ä»¥åã®å€ãšçŸåšã®å€ãååŸã§ããŸãã
@Component({...})
class MyReactiveComponent {
@ObservableInput() prop: Observable<string>; // Whatever syntax may be...
// emits [prevValue, currValue] and no OnChanges hook yay!!
propChanges$ = this.prop.pipe(pairwise());
}
https://github.com/rx-ts/ngrx/blob/master/src/utils/decorators.ts#L56 -L124
ããã¯ç§ã®å人çãªå®è£ ã§ãããå®å šã«æ©èœããéåžžã«åªããŠããŸããçµã¿èŸŒã¿ãå¯èœã§ããã°ãããã¯æ¬åœã«çŽ æŽãããããšã§ãã
ãããžã§ã¯ãã§å人çã«äœ¿çšãããœãªã¥ãŒã·ã§ã³ãnpmããã±ãŒãžãšããŠå ¬éããŸããã
https://github.com/futhark/ngx-observable-input
npm install ngx-observable-input
...
<image-item [url]="currentImageUrl"></image-item>
import { Component, Input } from "@angular/core";
import { ObservableInput } from "ngx-observable-input";
import { Observable } from "rxjs";
@Component({
selector: "image-item",
template: `<img [src]="url$ | async" />`
})
export class GalleryComponent {
@ObservableInput() @Input("url") public url$: Observable<string>;
...
}
ããã¯ããªãå€ãåé¡ã ãšæããŸãããæ©èœã¯ããªãçŽ æŽããããAngularã§ãããèŠãã®ã¯æ¬åœã«ããããã§ãã
ããã«ã¯ãŒã«ãªã®ã¯ãç£èŠå¯èœãªå ¥åã§ã¯
OnChanges
ããã¯ãå¿ èŠãªãããšã§ããpairwise
rxjsæŒç®åã䜿çšããŠãç£èŠå¯èœãªå ¥åã®ä»¥åã®å€ãšçŸåšã®å€ãååŸã§ããŸãã@Component({...}) class MyReactiveComponent { @ObservableInput() prop: Observable<string>; // Whatever syntax may be... // emits [prevValue, currValue] and no OnChanges hook yay!! propChanges$ = this.prop.pipe(pairwise()); }
ããããã°ããã®éç§ãæ©ãŸããŠããåé¡ãªã®ã§ãç§ã¯å°ã調æ»ããŠãããªããããã§èšåããŠããã®ãšåã解決çãæãã€ããŸããïŒ@gundïŒã
@Input
ãã³ã¬ãŒã¿ãå
éšçã«æ¡åŒµãããã®çš®ã®æ§æãå¯èœã«ããå°ããªãã³ã¬ãŒã¿ãã«ããŒïŒ @ObservableInput
ïŒãå®è£
ããŸããã ããã§ãã§ãã¯ã§ãnpmããã±ãŒãžãšããŠãïŒã ç°¡åãªäŸã§ãã¹ãããŠããŸããããæ¡åŒµãããžã§ã¯ãã«äœ¿çšããæéããããŸããã§ããã ãã£ãŒãããã¯ã¯å€§æè¿ã§ã:)
ããã«äœ¿çšäŸããããŸãïŒ
@Component({
selector: 'app-test',
template: `<span>{{ message$ | async }}</span>`
})
class TestComponent {
@ObservableInput<number>('price') price$: Observable<number>;
@ObservableInput<string>('name') name$: Observable<string>;
message$ = combineLatest(this.price$, this.name$).pipe(
map(([price, name]) => `${name} costs {price}`)
);
}
ãããŠããã®ã³ã³ããŒãã³ãã¯æ¬¡ã®ããã«äœ¿çšã§ããŸãã
<app-test [price]="price"
[name]="name">
</app-test>
@aleicsãããAOTã³ã³ãã€ã©ã§æ©èœããããšã確èªããŸããïŒ
@aleicsãããAOTã³ã³ãã€ã©ã§æ©èœããããšã確èªããŸããïŒ
ãããããã¡ããã @Input
ããããã£ã¯æ瀺çã«å®çŸ©ãããŠããªããããããã«äœ¿çšã§ããããã§ã¯ãããŸããã ãã ããWebã³ã³ããŒãã³ãã䜿çšããå Žåã®ããã«ãã¢ãžã¥ãŒã«ãCUSTOM_ELEMENTS_SCHEMA
ã§å®çŸ©ãããšãã³ã³ãã€ã«ããå¿
èŠããããŸãã
ãã®å·ã¯5幎éå ¬éãããŠããŸãð€Šââã ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã¢ãããŒãã容æã«ããããã«ãããå¿ èŠã ãšæããŸã
ã¢ã€ããŒãã€ãã«ç»å Žããã®ã§ã誰ããããã«åãçµãæéããããšæããŸããïŒ ãé¡ãããŸã-ãé¡ãããŸã-ãé¡ãããŸãïŒ
Omgç§ã¯ãããéåžžã«å¿ èŠã§ããããšã賌èªããŸãã å ¥åããŒã¿ã¯ãªã¢ã¯ãã£ããœãŒã¹ãšããŠåºåãããå¿ èŠããããngOnChangesã§æ©èœãããã«ã¯åé¿çã䜿çšããå¿ èŠããããŸã
æ¬åœã«æ¥œãã¿ã«ããŠããŸã
Angularã¯ãªãŒãã³ãœãŒã¹ã ãšæããŸãããGoogleãéå¶ãããããžã§ã¯ããã5幎以å ã«ã¹ã¿ãŒã®å€ããèŠæ±ãããåé¡ã解決ã§ããã¯ãã ãšèããã®ã¯ééã£ãŠããã®ã§ããããã GoogleãAngularã§äœæ¥ããããã«ããå€ãã®éçºè ãéãããšã劚ããŠãããç§ãæ°ä»ããŠããªãããã€ãã®çµæžçãªåé¡ããããŸããïŒ
@ etay2000ããããŸãã
åªå é äœã®é£éã¯ãã®ããã«ãªã£ãŠãããããªæ°ãããŸã
å éšã®ã°ãŒã°ã«ãŠãŒã¶ãŒã®èŠä»¶->ã³ã³ãã€ã©ãŒã®é«éåãšé¢ä¿ããã->ã¢ããªã®ãµã€ãºãå°ããããšãšé¢ä¿ããã->æ°èŠåå ¥è ãæ··ä¹±ãããªããã®->éçºè ãå®éã«æãã§ããããš
æè¡ãªãŒããŒã¯ãããéèŠã§ããããšã«åæãããšèšãã§ãããããå®éã«ã¯ãIgorãšMiskoã¯ããã³ãã¬ãŒãã®ã³ã³ãã€ã«ããã¥ãŒãã€ã³ãã£ã³ã°ãããã³ã¬ã³ããªã³ã°ã®èŠ³ç¹ããã»ãšãã©ã®åé¡ã«ã€ããŠèããåŸåããããŸãã Angularã®ã³ã³ã·ã¥ãŒããŒãäœãèšã£ãŠããŠãã解決çã¯åžžã«ãã³ãã¬ãŒãã·ã¹ãã ãå€æŽããããæ°ããã¬ã³ãã©ãŒãäœæããããã³ã³ãã€ã©ãŒãæ¹åããããšã§ãã
ãœãŒã¹ïŒhttpsïŒ//medium.com/@jeffbcross/jeffs-letter-to-the-angular-team-and-community-5367934a16c9ïŒ
æãè³æãããŠããåé¡ã®ããã€ããèŠãŠãã ããã
5幎åã«äœæãããé¢é£ããããŒã ã¡ã³ããŒããã®æåŸã®è¿ä¿¡-5幎åãçŸåšã®ã¹ããŒã¿ã¹ã¯äžæã§ãã
4幎åã«äœæãããé¢é£ããããŒã ã¡ã³ããŒããã®æåŸã®è¿ä¿¡-1幎åãçŸåšã®ã¹ããŒã¿ã¹-ã¢ã€ããŒãçéžããã®ãåŸ ã£ãŠããŸãã
4幎åã«äœæãããé¢é£ããããŒã ã¡ã³ããŒããã®æåŸã®è¿ä¿¡-3幎åãçŸåšã®ã¹ããŒã¿ã¹ã¯äžæã§ãã
4幎åã«äœæãããé¢é£ããããŒã ã¡ã³ããŒããã®æåŸã®è¿ä¿¡-2幎åãçŸåšã®ã¹ããŒã¿ã¹ã¯äžæã§ãã
as local-val
* ngIfãªãïŒ152804幎åã«äœæãããé¢é£ããããŒã ã¡ã³ããŒããã®æåŸã®è¿ä¿¡-2幎åãçŸåšã®ã¹ããŒã¿ã¹ã¯äžæã§ãã
4幎åã«äœæãããé¢é£ããããŒã ã¡ã³ããŒããã®æåŸã®è¿ä¿¡-3幎åãçŸåšã®ã¹ããŒã¿ã¹ã¯äžæã§ãã
4幎åã«äœæãããé¢é£ããããŒã ã¡ã³ããŒããã®æåŸã®è¿ä¿¡-決ããŠãçŸåšã®ã¹ããŒã¿ã¹ã¯äžæã§ãã
次ã«ãã³ã³ããŒãã³ãæ©èœã®ããã«ãããé«æ¬¡ã®ã³ã³ããŒãã³ããèš±å¯ãããã®ããããŸãããã¡ãããããå€ãã®è³æã®åé¡ããããŸããããããã¯å¯ŸåŠãããããšãæãã§ããŸããïŒã€ãŸãã察åŠãããå¿ ãããIvyã®çŽåŸã«å®è£ ãããããšãæåŸ ããŠããããã§ã¯ãããŸããïŒ ïŒããã¬ãŒã ã¯ãŒã¯ãšåå¿æ§ã®æ¥åžžçãªäœ¿çšã«é¢ä¿ããŠãããããã»ãšãã©ã®äººã䜿çšããŠãããã®ã§ãïŒngrxãæã人æ°ã®ããç¶æ 管çã©ã€ãã©ãªã§ãïŒã
ç§ã®ã¢ããªã¯ååçŒãäžãã£ããã®ã§ãã£ã±ãã§ãïŒåã«æè¡çãªå¶éã®ãããã³ã¢ã§ããé©åã«å®è¡ã§ããªããã®ããããŸãïŒãããªãã£ã«ããšãããã®åé¡ã®ã»ãšãã©ãããã¯ããŠããã€ãè§åºŠã®ãããã€ãã£ãã«ããããã§ããããã«ãªãããšãé¡ã£ãŠããŸã眮æã ããããã©ããããããããã¯æ¥ãŠããªãããã§ãã
ããã§ãããæ倧ã®åå¿æ§/éçºè ã®çµéšã«é¢é£ããåé¡ã®ããã€ãã®ç¶æ ãæ±ã£ãããã°æçš¿ãæ¬åœã«ããããããšããŸãããã
ãã®æ©èœã®æåã®ããŒãžã§ã³ãèªåã§ã³ãŒãã£ã³ã°ããŠã¿ãŠã¯ã©ãã§ããããã ç§
誰ãç§ã«å ããããã®ãïŒ
è€æ°ã®äººããã§ã«ããŸãããäŸãã°ã https://github.com/insidewhy/observable-input
ãããã®ã»ãšãã©ã®åé¡ã¯ãããããå¹ççã«è¡ãããã«ãã³ã³ãã€ã©ãŒãŸãã¯Angularã®ä»ã®å éšéšåãå€æŽããå¿ èŠãããããšã§ãã
ããã¯ã«ãŠã³ããããŸããã ã€ãŸããè§ã«é©åãªè²¢ç®ãããŸããã
è¯ã çµå±ã®ãšãããå©çšå¯èœãªãœãŒã¹ã³ãŒãã¯ãããŸãã å®éããã®å Žåãã³ã³ãã€ã©ãŒã«è§Šããå¿
èŠãããªããšæããŸãã
@ganqqwertyã©ã€ãã©ãªãäœæããåã«ãAngularå ã«å®è£ ããããšããŸããã ãã ããAngularã¯éåžžã«è€éã§ãã å ¬å¹³ãæãããã«ãã³ãŒãã¯Reactããã®ã¯ã¬ã€ãžãŒãª500è¡ã®é·ãã®é¢æ°ãããã¯ããã«èªã¿ãããç解ããããã§ããããæŽç·Žãããããã®ã§ãã ãããŠãããã䟡å€ããããšæã£ããªããç§ã¯ãŸã ãã®å®è£ ãããããã®åªåãããŠåãã§ããã§ãããã ãããã @ fxckãäžèšã§ç¹°ãè¿ããçç±ãããç§ã¯ããã䟡å€ããããšã¯æããŸããã AngularããŒã ã¯ã³ãã¥ããã£ã«è³ãåŸããŸããã圌ãã¯ãäžè¬çãªAngularã®äœ¿ãããããæ°ã«ããã«ãåžžã«æé©åãšããã©ãŒãã³ã¹ã«ãã ãã£ãŠããŸãã 5幎åã«å®èšŒãããåçŽãªåé¡ã«å¯ŸããŠå®åæãå®è£ ããããšãäœåãªãããããšãã«ãããŸãæ©èœãããã¬ãŒã ã¯ãŒã¯ã¯æ°ã«ããŸããã ããã§ãAngularã®ããšãæ°ã«ããã®ãããããã§ã«åãçµãã§ãããããžã§ã¯ãããµããŒãããããã«å¿ èŠãªæå°éã®åŽåãå®è£ ããå°æ¥ã®ãã¹ãŠã®ãããžã§ã¯ãã§å¯èœãªéããããåé¿ããããšã«ããŸããã
ããã¯Angularã®åé¡ã ãã§ãªããGoogleãæäŸããå€ãã®åé¡ã§ããããŸãã ãã®åé¡ãšäžèšã®@fxckã®ä»ã®åé¡ã¯ãGoogleã®åºæã®åé¡ã®åãªãäŸã§ãã DartãŸãã¯GoLangãèŠããšãéçºè ãéåžžã«ããç¥ãããŠããäžè¬çãªåé¡ãæèµ·ãããã®åé¡ã5幎以äžç¶ãããšãããããŸãã
ãããè¿œå ããå¿ èŠãããããšã«åæããŸããããã®ã¹ã¬ããã«å¯Ÿããå«æªæã¯å°ã倧ããã§ããã€ãŸããæ°è¡ã®ã³ãŒããç¯çŽãããã®ãè¿œå ããããšã«ã€ããŠè©±ããŠããã®ã§ãã @Inputã§è£ 食ãããã»ãã¿ãŒãšãå€ãããã·ã¥ããç¬èªã®ãµããžã§ã¯ãã䜿çšããŠããªãã¶ãŒããã«å ¥åã䜿çšã§ããããã«ãªããŸããã
https://github.com/angular/angular/issues/5689#issuecomment -507001686
ãããå®åçãããå Žåã¯ããã§ã«ããã€ãã®ç°¡åãªãµãŒãããŒãã£ãªãã·ã§ã³ããããŸãã
https://github.com/Futhark/ngx-observable-input
ç§ã¯Angularã®éçºã«æºè¶³ããŠããããã®ãããªããããªïŒæãŸãããšã¯ããïŒæ©èœã®ããã«ãé©ãã»ã©ãã«æ©èœã§ä¿¡é Œæ§ã®é«ããã¬ãŒã ã¯ãŒã¯ãæŸæ£ããããšã¯ãããŸããã
äžè¬çãªåé¡ã¯ãäž»ã«äººã ããããã©ã®ããã«èŠãããšãã芳ç¹ããã§ãã 誰ãã«ãšã£ãŠãããã¯æ°è¡ã®ã³ãŒãã§ãããäœããå€æŽ/è¿œå ããã®ã¯éåžžã«ç°¡åã«èŠããŸãããå®éã«ã¯ããã倧ããªç¯å²ãšå€ãã®å¯äœçšããããããããŸãã ããããã¹ãŠãèæ ®ã«å ¥ããå¿ èŠãããããã€ãã®ããã«ããããã¯ã®ã©ã€ã³ã¯é·ãããã¹ãŠã«ããããã®ã³ã¹ããä»å 䟡å€ãããã³åªå é äœããããŸãã
ç§ã¯å人çã«ããããã®åé¡ã®ãã¹ãŠãããã«è§£æ±ºããããšã¯éããªãããšãææããããšæããŸãã
ããããä»ãã¢ã€ããŒãéªéã«ãªããããã°ããã®ééçã«åºãŠããããšãé¡ã£ãŠããŸããããšãã°ãäžäœ25ã®è³æåé¡ã«é¢ããããçš®ã®å ¬åŒã¢ããããŒããå ¬éãããããšãé¡ã£ãŠããŸãã
ã€ãŸãããã®ãµã€ãºã®ãããžã§ã¯ãã§ã¯ããããžã§ã¯ã管çã§åªå
é äœãèæ
®ãããäžäœ25ïŒãŸãã¯ãã®ä»ïŒã®è³æã®åé¡ãã¹ãŠã«å¯ŸããŠäœããã®èšç»ãç«ãŠãããšã¯ã§ããŸããã ãããã®ã»ãšãã©ã«ã¯ã effort
ã¿ã°ãããããŸãã ããã°ã«æçš¿ããŠããããã«ã€ããŠç¥ã£ãŠããŠãäœããã®èšç»ãããããšãã³ãã¥ããã£ã«ç¥ãããŠãã ããã
ç§ã¯ç¢ºãã«AngularãæŸæ£ããŸããããã®æ¬ ç¹ã¯ãã¹ãŠãä»ã®ãã¹ãŠã®éžæè¢ãããã¯ããã«åªããŠããããã§ãã ãããããã³ãã¥ããã£é¢ä¿ç®¡çãïŒå ·äœçã«ã¯githubïŒãäžè¶³ããŠãããšèšã£ãŠãéèšã§ã¯ãããŸããã
// ç·šé
è¯ã人ã¯ãã®äžè«èª¿æ»ã«èšå ¥ããŠããã ããŸãããã ããªãã®çŸåšã®ç¶æ³ãšèæ ®ããããã¹ãŠã®ããšãèãããšããããã®åé¡ã®ã©ããããªãã«æã圱é¿ãäžããŸã/ããªãã®éçºè ã®çµéšãæãæ¹åããã§ãããhttps://forms.gle/cprhx239kuqwWd5M8
@fxckãããæžããŠãããŠããããšãã AngularããŒã ã奜ããªãšãã«å¥œããªããšããããšããäºå®ã誰ããåãå ¥ããã®ã§ã¯ãªãããšæãå§ããŠããŸããã ããã¯ç¢ºãã«åœŒãã®æš©å©ã§ãããéçºè ã®å£°ã絶ããç¡èŠãããšãã¯ã人ã ã圌ãã«å£°ããããå¿ èŠããããšæããŸãã 誰ããåé¡ã®å³æ解決ãæåŸ ããŠãããšã¯æããªãããšã«åæããŸããã4ã5幎éããããç¡èŠããããåé¡ãèªåçã«ããã¯ããããŸã§åŸ ã€ã ãã§ã¯ãGoogleãå®è¡ãããããžã§ã¯ãã¯ãã¡ãããã©ã®ãããžã§ã¯ãã§ãæ¬åœã«å°éçã§ã¯ãªãããã§ãã 圌ãã¯ãæªè§£æ±ºã®åé¡ã®æã«ãFixed by Ivyãã¿ã°ãè¿œå ããããšã§æéãè³Œå ¥ãããã®åŸäœãããŸããã§ããã
ç§ã¯ç¢ºãã«AngularãæŸæ£ããŸããããã®æ¬ ç¹ã¯ãã¹ãŠãä»ã®ãã¹ãŠã®éžæè¢ãããã¯ããã«åªããŠããããã§ãã ãããããã³ãã¥ããã£é¢ä¿ç®¡çãïŒå ·äœçã«ã¯githubïŒãäžè¶³ããŠãããšèšã£ãŠãéèšã§ã¯ãããŸããã
ãã®æç« ã¯ç§ã®èããå®å šã«èŠçŽããŠãããšæããŸãã
@chriszrcç§ã¯ãã®ã¹ã¬ããã®äœããæãã¿ããšããŠå®éã«ã¯è§£éããŸããã§ããã 人ã ãæçµçã«Angularã§ãã©ã¹ãã¬ãŒã·ã§ã³ãçºæ£ããäžåºŠã«äœå¹Žãã®éå®æçã«åé¡ãç¡èŠããŠããããã§ãã ç¹ã«ãã®åé¡ã«ã€ããŠã§ã¯ãªããäœããã®åœ¢ã®ã³ãã¥ããã£ã®çžäºäœçšãç¶æãããšããååã«ã€ããŠã§ãã AngularããŒã ã¯ãä»ã®èª°ãããã¯ããã«åªããŠãããšèããããŠããã®ã§ã誰ã«ãšã£ãŠãäœãæåããç¥ã£ãŠãããããéçºè ã®èŠæ±ãç¡èŠã§ãããšæããŠããŸããïŒ
@chriszrcãã®ã¹ã¬ããã«ã¯æãã¿ã¯èŠããããç解ã§ãã欲æ±äžæºããããããããŸãã ãã®èŠæ±ãšããã«é¢é£ãã倱æããæ°è¡ã®ã³ãŒããç¯çŽããããšåäžèŠããããšã¯èªåŒµã ãšæããŸãã ã³ãã¥ããã£ãèç«ãããŠããã®ã¯ãã®åé¡ã ãã§ã¯ãªãã @ fxckãäžã§æèµ·ãã人æ°ã®ããåé¡ã®éèŠãªã³ã¬ã¯ã·ã§ã³ãç¡èŠãããŠããŸãã
ã¿ãªãããããã«ã¡ã¯ããã®ã¹ã¬ããã®æ²é»ããèš±ããã ããã ãã°ããã®éã2ã€ã®çŽäº€ãããªã¯ãšã¹ãããããŸãã
ã©ã¡ãã®èŠæ±ãç§ãã¡ã®ã¬ãŒããŒã«ãããã©ã¡ãã«ãé·æãšçæããããŸãã ããšãã°ãæåã®æ¹åã«é²ããšãRxJSã®è¡šçŸåè±ãã§æå³çã«è±å¯ãªAPIãåããŠäœ¿çšãããšã³ãžãã¢ãããã¬ãŒã ã¯ãŒã¯ã«ã¢ã¯ã»ã¹ãã«ãããªããŸãã å€ãã®äººã ã¯ãAngularã¢ããªã®ããããå Žæã§RxJSã䜿çšããããšã«æžå¿µãæ±ããŠãããããŸããŸãªçµéšã¬ãã«ã®ããŒã ã¡ã³ããŒéã§ãœãŒã¹ã³ãŒããèªã¿ã«ããããŠããŸãã
åæã«ããã§ã«å€ãã®ãªã¢ã¯ãã£ãAPIããããŸãããAngularãæäŸããããªããã£ãã®äžéšã¯å®å šã«å¿ é ã§ãããç©äºã¯ããŸãé£æºããŠããŸããã ãšã¯ããããªã¢ã¯ãã£ããµããŒããæ¹åããããšã¯çã«ããªã£ãŠããŸããããããAngularã®ã³ã¢ã®äžéšã«ããããç·å¯ã«ååããŠããã³ãã¥ããã£ãããžã§ã¯ãïŒngrx-Angularã®ãªã¢ã¯ãã£ãæ¡åŒµãªã©ïŒã«å§ä»»ããå¿ èŠããããŸããïŒ
ãã®åé¡ã解決ããæ¹æ³ã¯ãããããããŸããã次ã®ããšãèæ ®ããå¿ èŠããããŸãã
çŸåšãGitHubã®äž»èŠãªåé¡ã®ããã€ãã«åªå é äœãä»ãã察åŠã§ããæãèŠæ±ããã圱é¿åã®ããæ¹åãæ€èšããŠããŸãã ããã¯é£ãããã®ã®1ã€ã ãšæããŸãã®ã§ãããŒããããã®ã¯é£ããã§ãã
@mgechevãè¿ä¿¡ããã ãããããšãããããŸãã rxjsãšãªã¢ã¯ãã£ãAPIãïŒç§ã®å人çãªæ祚ã§ã¯ãªãïŒå¥ã®æ¡åŒµæ©èœã«åå²ãããå Žåãç¹å®ã®ç¶æ ã¹ãã¢/ reduxå®è£ ãšçµã¿åãããªãæ¹ãçã«ããªã£ãŠããŸããïŒ ç§ã¯ããã«ngrxããngxsïŒãã€ã©ãŒãã¬ãŒããã¯ããã«å°ãªãããã³ã¬ãŒã¿ã§ãããè§åºŠã®ãããããã«æããŸããïŒã«ç§»ããæåŸã«ç§ç°ã«ç§»ããŸãããããã¯ç§ã®çŸåšã®ãæ°ã«å ¥ãã§ãããç§ãæãéçºããŠãããã®ã§ãã ãŸãã¯ãngrxã«ãŸãšããããå Žåã§ããå°ãªããšãå¿ èŠãªããŒããè¿œå ããã ãã§ç°¡åã«ã§ããã®ã§ãngrxã®äœ¿çšããããã®äŸåé¢ä¿ã®çµã¿èŸŒã¿ã«çžãããããšã¯ãããŸãã-
rxjsãšãªã¢ã¯ãã£ãAPIãå¥ã®æ¡åŒµæ©èœã«åå²ãããå ŽåïŒç§ã®å人çãªæ祚ã§ã¯ãããŸããïŒ
ãããèµ·ãããšèšã£ãŠããã®ã§ã¯ãããŸããã ç§ã®ã³ã¡ã³ãã§ã¯ããããžã§ã¯ãã®ç¯å²ãšç§ãã¡ãæã£ãŠããããŸããŸãªèæ ®äºé ã瀺ãããšãã§ããããã«ãéžæè¢ã®äžå®å šãªãªã¹ããå ±æããŠããŸãã
@mgechev確ãã«ãè¿ä¿¡ããããšã
ãã ããAngularã®ãªã¢ã¯ãã£ããªéšåãäœããã®åœ¢ã§ã³ãã¥ããã£ãããžã§ã¯ãã«ãéæ Œããããå Žåãããã¯ãªã¢ã¯ãã£ããAngularã®äºçŽåžæ°ã«ãªãããšãæå³ããã®ã§ã¯ãªãã§ããããã
@mgechevããªãã®çã¿ãäžåºŠã«2ã€ã®æ¹åã«åŒãè£ãããŠããã®ãæããŸãã ç§ãã¡ã®ããŒã ã¯ãå®éã«ã¯åœä»€å/åå¿åã®éšåãåå²ããããšã«å察ããŠããŸããã
ãã®ãããªåå²ã®èŠä»¶ã¯æ¬¡ã®ãšããã§ãã
äžèšã«åºã¥ãïŒ
äžèšãç§ãã¡ã®äžç芳ã§ãããä»ã«ãããããããããšãç解ããŠããŸãã ç§ããããæžããŠããçç±ã¯ïŒ
æ©èœãè¿œå ããŠãã ãã
@mgechevç§ã¯ããªãã®å¿é
ãããŸããã ãã®ææ¡ã¯ã2ã€ã®äžçãçµ±äžããããåå¿è
åãã®ç°¡åãªã€ã³ã¿ãŒãã§ãŒã¹ãšçµã¿åãããããšã«é¢ãããã®ã§ãã ã©ã¡ãããéžæããã®ã§ã¯ãªããçµã¿åãããå¯èœã«ããããšã§ãã ããšãã°ãéçºè
xã¯ããã°ããããªã¢ã¯ãã£ãã³ã³ããŒãã³ããæ§ç¯ããããšã«ããŸããã ãããŠãéçºè
yã¯ãããã»ã©åå¿æ§ã®äœããããžã§ã¯ãã§ããã䜿çšããããšã«ããŸããã ãªãã ãã§ããïŒ ãªã圌ã¯ngrxæ¥çå€ã«äŸåããå¿
èŠãããã®ã§ããïŒ
2ã€ã®äžçã®éãã¯ãæçµçãªã¹ããŒãã³ã³ããŒãã³ããšäžå€®ã®ç¶æ
ã¹ãã¢ã§ç¶æ
ãä¿å/管çãããã©ããã§ãããããngrxã®ç®çã§ãããã³ã³ããŒãã³ãã®å Žåããã¬ãŒã ã¯ãŒã¯èªäœãã€ããŒãã©ãŒã§ããå¿
èŠããããšæããŸãã
ãã°ããã®éã2ã€ã®çŽäº€ãããªã¯ãšã¹ãããããŸãã
- ãã¬ãŒã ã¯ãŒã¯ã§ã®ãã¡ãŒã¹ãã¯ã©ã¹ã®RxJSãµããŒãã®åäž
- Angularã®RxJSãå°ãªããªãããªãã·ã§ã³ã«ãªãå¯èœæ§ããããŸã
ã©ã¡ãã®æ¹æ³ã§ãåé¡ãããŸããããããã«ãããAngularã«ãã©ãã©ãªæããããããšããããŸããããã¯ãããããªãŒãå«ããã¬ãŒã ã¯ãŒã¯ãé€ããŠãæåŸã«è¡ãããšã§ãã
å人çã«ã¯ããã¹ãŠã®Angularããã±ãŒãžïŒHTTPãã«ãŒã¿ãŒããã©ãŒã ïŒã«RxJS以å€ã®ããŒãžã§ã³ã䜿çšããæ¹æ³ãç¥ããããšæããŸãã ãããã®RxJS以å€ã®ããŒãžã§ã³ã¯é©åã§ã¯ãªãã®ã§ã¯ãªãããšæããŸãããã®ãããããããRxJSããããŸãã
ã€ãŸããäœãã足ããªãå Žåãé€ããŠãïŒ2ïŒã¯å®è¡å¯èœã§ã¯ãããŸããã
PSç§ã¯ãããã®èŠæ±ããçŽäº€ããšã¯èšããŸããã ãå察ãã®ãããªãã®ã§ãã
Angularã®RxJSãå°ãªããªãããªãã·ã§ã³ã«ãªãå¯èœæ§ããããŸã
奜å¥å¿ãã@mgechev ããã®ããã®Githubã®åé¡ã¯ãããŸããïŒ ïŒç§ã¯äœãèŠãŠããŸãããïŒãããšãããã¯ãã£ãšã°ãŒã°ã«ã®ãã®ã§ããïŒ
@pauldraper githubã§å°ãªããšã1ã€ã®åé¡ãçºçããŸããã誰ãããrxjsãã©ãã»ã©è€éã§ãå®å šã«ãªãã·ã§ã³ã§ããããšãæãã§ããã®ãã«ã€ããŠäžæºãèšã£ãŠããŸãã å人çã«ã¯rxjsã倧奜ãã§ãããä»ã§ã¯2ã€ã®ããŒã ãšååããŠããžã¥ãã¢éçºè ãšã·ãã¢éçºè ã®äž¡æ¹ã«ææãšå«æªæããããããŸããã ãŸããçŽäº€ã¯å察ãããåªããçšèªã§ããäž¡æ¹ã®ãªã¯ãšã¹ããåæã«å®è£ ã§ããããã§ãïŒåãœãªã¥ãŒã·ã§ã³ã¯ãè€æ°ã®APIãªãã·ã§ã³ãæäŸããŠäºåŸå¯Ÿå¿çãã€åŒ·å¶çã«æ¶è²»ããããšã§ãäžæ¹ãä»æ¹ãæãªãããšãªãæ©èœã§ããå ŽåïŒã
githubã®rxjsã«ã€ããŠäžå¹³ãèšãã³ã¡ã³ãããšã«ãããããäœå人ãã®éçºè ãåé¡ãªãããã䜿çšããŠæ¥œããã§ããŸãã
ããã¯ãAngularã®äžåã«ã€ããŠè©±ãåã£ãŠãããšãã«ãäžèšã§æçš¿ãããã©ãŒã ã®çµæã§ãïŒçŽ200人ãåçããŸããïŒã
åœç¶ã®ããšãªããããã©ãŒã ã¯ãå°»ã®æ倧ã®çã¿ã§ãããã©ããã@brandonrobertsãš@MikeRyanDevãã€ãã«äœããæçããŠããããã§ãã
githubã®rxjsã«ã€ããŠäžå¹³ãèšãã³ã¡ã³ãããšã«ãããããäœå人ãã®éçºè ãåé¡ãªãããã䜿çšããŠæ¥œããã§ããŸãã
ç§ã¯rxjsã倧奜ãã§ãããç§ã¯ããã»ã©æ¥œèŠ³çã§ã¯ãããŸããã æ¥ãªåŠç¿æ²ç·ã§äœããåŠã¶ããã«æéãè²»ãããªããã°ãªããªããšããèããçãå°œããŠããŸã£ãå€ãã®éçºè ãšäžç·ã«ä»äºãããã®ã¯æªå€¢ã§ãã ãããŠãã³ãŒãã£ã³ã°ããããéã皌ãããšãã¯ããã«éèŠãã人ã¯ããããããŸãïŒDãŸãã¯ã1æ¥ã®éã«åŠã¹ãªãããšã¯ããŽãã ãšæã£ãŠããæ»æçãªãžã¥ãã¢éçºè ã
æ¥ãªåŠç¿æ²ç·ã§äœããåŠã¶ããã«æéãè²»ãããªããã°ãªããªããšããèããçãå°œããŠããŸã£ãå€ãã®éçºè ãšäžç·ã«ä»äºãããã®ã¯æªå€¢ã§ãã ãããŠãã³ãŒãã£ã³ã°ããããéã皌ãããšãã¯ããã«éèŠããå€ãã®äºº
ãããã¯ãAngularãããã«å¿ããããšããŠããéçºè ã§ãããçãå°œããŠãåŠã³ãããããŸãããïŒ :)ãããŠããšã«ãããã®æç¹ã§èª°ãæ°ã«ãããã Angularã¯ãã°ããåããååšããŠãããã©ãã«ãè¡ããŸããã芳å¯å¯èœãªã©ã€ããµã€ã¯ã«ã芳å¯å¯èœãªå ¥åã芳å¯å¯èœãªã€ãã³ããè¿œå ããŠãããã©ã¯ã·ã§ã³ã倱ãããããšã¯çµ¶å¯Ÿã«ãããŸããã ãããã®3ã€ã®å°ããªãã®ãè¿œå ããã ãã§ããã°ããã®é人ã ã¯æºè¶³ããã§ãããïŒãããŠhttps://indepth.dev/component-features-with-angular-ivy/ã§ããã«åŸã£ãŠåºæ¬ããã±ãŒãžãå®æãããŠãã ããïŒã
ããã¯ãã¹ãŠãèšããŸãã IMHO Angularã¯äžè²«æ§ãä¿ã¡ãããå€ãã®RxJSã䜿çšããå¿ èŠããããŸããRxJSããŸã£ãããªãå ŽåãAngularã«ã¯ãªããŸããã
ãããã¯ãAngularããã®æã«å¯Ÿå¿ããããšããŠããéçºè ã§ããïŒ :)
ã¯ããrxjsã䜿çšããŠã³ãŒããèšè¿°ãããéçºè ã®ã¿ã«å¯Ÿå¿ããã®ã¯å€§ããã§ãã ç§ã¯rxjsã䜿çšããããšã奜ã¿ãŸãããAngularãäž¡æ¹ã®éçºè ã»ããã«å¯Ÿå¿ã§ããããã«ããããšæããŸãã ãªãAngularã¯ç§ãã¡ã ãã«å¯Ÿå¿ããèãæ¹ãéã人ã«ã¯å¯Ÿå¿ããªãã®ã§ããïŒ ç¹ã«ç§ãã¡ãå€æ°æŽŸã§ã¯ãªãå°æ°æŽŸã«ãããšç§ãä¿¡ãããšãã
ç¹°ãè¿ãã«ãªããŸããã芳å¯å¯èœãªã©ã€ããµã€ã¯ã«ãå ¥åãã€ãã³ããè¿œå ããå Žåã®ããã«ãå®å šã«åå¿ãããããšã¯ãããªãã話ããŠãããã®ã«ãŸã£ãã圱é¿ãäžããŸããããä»ã®ã°ã«ãŒããéåžžã«å¹žãã«ããŸãã
ãŸããã³ã³ããŒãã³ãæ©èœã¯ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã奜ããã©ããã«é¢ä¿ãªã䟿å©ã§ãã
@fxckç§ã¯
è§åºŠãã³ã¢ãéçºããããšãã©ã®ããã«æ±ºå®ãããã«ãããããïŒåå¿çãã©ããã«ãããããïŒãçæ³çãªäžçã§ã¯ãå察ã®ããŒãºã«å¿ããããã«å察ã®ããã±ãŒãžãäžã«æ§ç¯ãããŸãïŒããšãã°ã @angular/reactive
ãŸãã¯@angular/imperative
-ããè¯ãååã§ããŸãããã°ïŒã
ã³ãã¥ããã£ã«è¡ããããã®2ã€ã®ã©ã¡ãããç§ã«ãšã£ãŠã¯äžéšã®äººã ã«ãšã£ãŠã¯æ Œäžãã§ãããç§ã«ãšã£ãŠã¯ãåªãããªã¢ã¯ãã£ããã¬ãŒã ã¯ãŒã¯ã§ãããšããèŠéããæã€è§åºŠããããããããæ¡çšããçç±ã§ããã
ã¡ãªã¿ã«ãã³ã¢ãšæ¡åŒµããã±ãŒãžã®äž¡æ¹ã®åçŽãã®ããã«èšãã°ãããã¯åœä»€åãããªã¢ã¯ãã£ãåãžã®ããªããžã³ã°ãããããªããžã³ã°ãã¯ããã«ç°¡åã§ãããããè§åºŠãªã¢ã¯ãã£ããç¶æããåœä»€åãšã¯ã¹ãã³ã·ã§ã³ã䜿çšããæ¹ãç°¡åã ãšæããŸãã
å 責äºé ïŒç§ãä»®å®ã«åºã¥ããŠå®åŒåããæåŸã®ãã€ã³ã-ã³ã¢åœä»€ãæžãæ¹ãã¯ããã«ç°¡åã§ãã£ãŠãé©ãããšã¯ãããŸãã-æ¡åŒµãªã¢ã¯ãã£ãã¯ããè€éã«ãªããŸãã
奜å¥å¿ãã@mgechev ããã®ããã®Githubã®åé¡ã¯ãããŸããïŒ ïŒç§ã¯äœãèŠãŠããŸãããïŒãããšãããã¯ãã£ãšã°ãŒã°ã«ã®ãã®ã§ããïŒ
Googleã®å éšçãªãã®ã§ã¯ãããŸããã ïŒç§ãããŒã ã«åå ãããšããšåãããã«ïŒå€éšèŠä»¶ãšå éšèŠä»¶ã®å ±ééšåãã©ãã»ã©å€§ãããã«é©ãããããšã§ãããã äž»ãªéãã¯ããã«ãã·ã¹ãã ãšäŸåé¢ä¿ã®ç®¡çã«ãããŸãããGoogle瀟å¡ã«ã¯Google瀟å¡ä»¥å€ã®äººãšã»ãŒåãèŠä»¶ããããŸãã
ç§ãã¡ã¯äœåãã®éçºè ãšé£çµ¡ãåãåã£ãŠããŸã-å€ãã®å€éšäŒæ¥ãå éšããŒã ããããŠå人ã®è²¢ç®è ã ã©ã¡ãã®å ŽåããRxJSã«å®å šã«åå ããããšæã£ãŠãã人ãããã°ããããèªåã«ãšã£ãŠæ£ããéžæã ãšã¯æããªã人ãããŸãã ã©ã¡ãã®é£å¶ã«ãåªããè°è«ããããŸãã
ç¹ã«ãååã«ç¢ºç«ãããåé¿ç/ã³ãã¥ããã£ãœãªã¥ãŒã·ã§ã³ãããããšãèãããšãããã¯æ¥ãã§æ±ºå®ããã決å®ã§ã¯ãããŸãããã³ãã¥ããã£ã§è¡ãããäœæ¥ã¯ãè¿œå ã®ããŒã¿ãã€ã³ããåéããçŸåšã®å€æ°ã»ããã®æé©ãªãœãªã¥ãŒã·ã§ã³ã確ç«ããã®ã«åœ¹ç«ã¡ãŸãã
Angularã¢ããªãéçºãããšãã«ã1ã€ã®çµ±äžãããã¢ãããŒããåå¿çãŸãã¯å¿ é ïŒãããžã§ã¯ãããšã®éžæïŒã«ããããšã¯éåžžã«æçã ãšæããŸãã çµã¿åãããŠçµã¿åãããæ©èœã¯ãéçºãšã¯ã¹ããªãšã³ã¹ãæ¯æŽããããéDRYã³ãŒãïŒéãªã¢ã¯ãã£ãå ¥åãªã©ïŒãäœæãããããã®ã«åœ¹ç«ã¡ãŸããã
åç¬ã§ã¯äœãèµ·ãããªãã®ã§ã倧éã®éçºè ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã«åãã¬ãŒãã³ã°ããã®ã«èŠåŽããŠããäŒæ¥ç°å¢ãå®å šã«ç解ã§ããŸãã ãããã£ãŠãåœä»€åãåé€ãããšãå®éã«ã¯äŒæ¥ã®ã¹ã€ãŒãã¹ãããããAngularã移åããŸããããã¯ãAngularã®ãããªãã¬ãŒã ã¯ãŒã¯ã®å€§ããªäž»èŠãŠãŒã¶ãŒããŒã¹ãæ§æãããããçŸå®çã«ã¯èµ·ãããŸããã
ãšã¯ãããç§ãçŸå®çã§ãããšã¯æããªãã®ã¯ãåœä»€åã®ã€ã³ã¿ãŒãã§ãŒã¹ã®äžã«ãªã¢ã¯ãã£ããªã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããšã§ãã ä»ã®æ¹åã¯ããªãã¶ãŒããã«ã®åºåãå€æ°ã«ãã€ã§ãæžã蟌ãããšãã§ãããããå¿ é ã«äœ¿çšã§ãããããéåžžã«ç°¡åã§ãã å®éãããã¯ãAngularãã«ããŒã®äžã®å€ãã®å Žæã§ãã§ã«è¡ã£ãŠããããšã§ãã
ãããã£ãŠãç§ã¯Angularããã®ã³ã¢ã§å®å šã«ãªã¢ã¯ãã£ãã«ããããšã«æ祚ãã次ã«ãã®äžã«åœä»€åã®ãã©ãããŒããäœæããŸãã
ãã®ã¢ãããŒãã®äž»ãªåé¡ã¯ãåœä»€åãŠãŒã¶ãŒã®ç§»è¡æé ã倧ãããªãå¯èœæ§ãéåžžã«é«ãããšã§ãã ããã¯äŒæ¥ç°å¢ã§ã¯ããã§ãããAngularããŒã ãé²æ¢ããããšããŠããããšãšãŸã£ããåãã§ããå¯èœæ§ããããŸãããããã£ãŠãææ¡ã¯ã³ã¢ã§äžå¯æ¬ ã§ãã
@mgechevããã¯æ°åæèµ·ãããŠããã®ã§ããªã¢ã¯ãã£ãã³ã¢/åœä»€åæ¡åŒµã«ã€ããŠã®ããªãã®èããèããŠããããç«ã€ããã®è¶³ããããã©ãããèãã®ã¯èå³æ·±ãã§ãããïŒ
ã©ã¡ãã®å ŽåããRxJSã«å®å šã«åå ããããšæã£ãŠãã人ãããã°ããããèªåã«ãšã£ãŠæ£ããéžæã ãšã¯æããªã人ãããŸãã ã©ã¡ãã®é£å¶ã«ãåªããè°è«ããããŸãã
çŽ æŽããããç¥ã£ãŠãããšè¯ãã RxJSã§ãã«ã€ã³ããããšãå®çŸ©ããŸããïŒ èŠ³å¯å¯èœãªã©ã€ããµã€ã¯ã«ã芳å¯å¯èœãªå ¥åãããã³èŠ³å¯å¯èœãªã€ãã³ããè¿œå ããããšã¯ãããã«ã©ã®ããã«é©åããŸããïŒ ãããããããã®ãããã«ããååã«ç¢ºç«ãããåé¿ç/ã³ãã¥ããã£ãœãªã¥ãŒã·ã§ã³ãã¯ãããŸããã
@fxckãããã®ã©ããå®éã«ã¯ãååã«ç¢ºç«ãããåé¿ç/ã³ãã¥ããã£ãœãªã¥ãŒã·ã§ã³ããæã£ãŠããŸããã
ï¿Œããã¯æ¬åœã§ãã ç§ã¯ãããã®ãœãªã¥ãŒã·ã§ã³ã®1ã€ãäœæããŸãããããã³ãã¬ãŒãã®ã¿ã€ããã§ãã¯ãäžååã§ããããšã«äŸåãã1ã€ã®å€§ããªããã¯ãåå ã§ã®ã¿æ©èœããŸãã ãã®ã¹ã¬ããã«æçš¿ãããŠããä»ã®è§£æ±ºçãããã€ããã§ãã¯ããŸããããããããã«æ¬¡ã®åé¡ã®å°ãªããšã1ã€ããããŸãã
ç§ã«é¢ããéãããããããŸãè¡ãããšã¯äžå¯èœã§ãã
芳å¯å¯èœãªã€ãã³ãã¯ããã«æªåããã³ãã¥ããã£ãœãªã¥ãŒã·ã§ã³ã¯ããã»ã©å€ããããŸãããéåžžãè¿œå ã®ãã«ãã¹ããããå¿ èŠã§ããïŒå Žåã«ãã£ãŠã¯ãmonorepoã»ããã¢ããã§SSRãç ŽæããŸãïŒãããã«ããã¯ããŸãïŒããšãã°ãã¯ã©ã¹æ¡åŒµã䜿çšããŠããå ŽåïŒãã©ã€ããµã€ã¯ã«ã§èŠ³å¯å¯èœãªã€ãã³ããååŸããŸããAngularã¯ããããã€ãã£ãã«ãµããŒãããŠããªãããã§ãïŒ https://github.com/typebytes/ngx-template-streams/issues/8
ã©ã€ããµã€ã¯ã«ã€ãã³ãã¯ééããªããæãç°¡åãã§ãããããã§ãã¯ã©ã¹æ¡åŒµãŸãã¯ã«ã¹ã¿ã ãã³ã¬ãŒã¿ã«äŸåããå¿ èŠããããã©ã¡ããçæ³çã§ã¯ãããŸããã
@fxckç§ãç¥ãéãã芪ã¯ã©ã¹ïŒeughïŒãŸãã¯ãŠãŒã¶ãŒãèªåã®destroyã©ã€ããµã€ã¯ã«ã€ãã³ãããåŒã³åºããªããã°ãªããªãã¡ãœããïŒããã«æªãïŒã䜿çšããã«ã©ã€ããµã€ã¯ã«ã€ãã³ããµãã¹ã¯ãªãã·ã§ã³ãã¯ãªãŒã³ã¢ããããããšã¯ã§ããŸããã
ã©ã€ããµã€ã¯ã«ã€ãã³ãã¯ééããªããæãç°¡åãã§ãããããã§ãã¯ã©ã¹æ¡åŒµãŸãã¯ã«ã¹ã¿ã ãã³ã¬ãŒã¿ã«äŸåããå¿ èŠããããã©ã¡ããçæ³çã§ã¯ãããŸããã
ã«ã¹ã¿ã ãã³ã¬ãŒã¿ã䜿çšããŠã©ã€ããµã€ã¯ã«ã€ãã³ããïŒãªã¢ã¯ãã£ãã«ããããã«ïŒå®è£ ããããšããŸããããããã¯èŠçã§ãã ãã¯ã©ã¹æ¡åŒµãªãã§ã100åã®ããã¯ãªãã§ãããå¯èœãã©ããã¯ããããŸãããã è§åºŠãæ¡åŒµãããŠãŒã¶ãŒã®å¯èœæ§ã¯ãããŸã§ã®ãšããéåžžã«è²§åŒ±ã§ããããããè¡ãã«ã¯ããã¯ãŸãã¯å€ãã®å®åæã«äŸåããŠããŸãã
@ tonivj5ã³ã³ããŒãã³ãæ©èœããããªãã¯APIã§ããå Žåãããã¯ç¶æ¿ãªãã§ã©ã€ããµã€ã¯ã«ãå®è£ ããããã®æœåšçãªæ¹æ³ã ãšæããŸããïŒ
@ntziolisã¯ããããã§ãããæ©èœã«ã€ããŠèšåããå¿ èŠããããŸããç§ã¯å®éã«ngx-sub-formã®ã©ã€ããµã€ã¯ã«éšåã«åãçµãã§ãããæ©èœã¯ãŸãã«åœ¹ç«ã€ãšæããŸãã ãããŸã§ã®éãã³ã³ããŒãã³ããã¡ã¯ããªã«ãã¿ããããããããšã¯éåžžã«å®è¡å¯èœã§ãã ããã¯ngx-sub-formã®å€ã§ã¯éåžžã«äŸ¿å©ã ãšæãã®ã§ããã®ããžãã¯ãå¥ã®ã©ã€ãã©ãªã«åå²ãããšæããŸã
@ntziolisãã®æç¹ã§ãIvyã®çŽæãå®éã«å®è¡ãããã®ãèŠãããšãã§ãããã©ããã¯
è§åºŠå¹æã確èªããŸãããïŒ ïŒngrx / Effectsã§ã¯ãããŸããïŒ https://dev.to/stupidawesome/reactive-adventures-in-angular-introducing-angular-effects-1epfãã®ããŒã«ã䜿çšãããšãå®å
šã«ãªã¢ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
芪ã³ã³ããŒãã³ããšåã³ã³ããŒãã³ãéã®åæ¹åã®èŠ³å¯å¯èœãªç¶æ
ãå«ãŸããŠããŸã
https://dev.to/stupidawesome/exploring-the-angular-effects-api-2gol
ããŒãžã§ã³9.1.0ã§ã¯ãVue3ã®CompositionAPIã«åºã¥ãcomposition / hooksã¢ãã«ãå°å
¥ãããŸãã
Angularãåå¿æ§ãåŠçããããã®æ¬åœã«æ¬¡ã®ã¹ãããã ãšæããŸãã
@mgechev
ããã¯ãç¹ã«ç¢ºç«ãããåé¿ç/ã³ãã¥ããã£ãœãªã¥ãŒã·ã§ã³ãããããšãèãããšãæ¥ãã§ãããã決å®ã§ã¯ãããŸããã
奜å¥å¿ã匷ãã®ã§ãããç§ãã¡ãšäœäººã®Google瀟å¡ãAngularã®ææ決å®ããã»ã¹ã«ç©æ¥µçã«è²¢ç®ããŠããŸããïŒ
ããªãã¯ãããæ¥ãããã¹ã決å®ã§ã¯ãªãããšã瀺ããŸãããããç§ã¯ããªãã®æ¥ãã§ããªããšããããªãã®å®çŸ©ã¯äœã§ãããçåã«æããŸããïŒ ããã¯ããFixed by Ivyãã¿ã°ãå©ããããå€ãã®éçºè ãåã³ãã€ãºãåºãå§ãããŸã§ç¡èŠããŸããïŒ ãªã¢ã¯ãã£ããªäœæ¥ã®å¯Ÿè±¡ãšãªãããŒãžã§ã³ã念é ã«çœ®ããŠããŸããããããšãä»ã®æ°ããã³ã³ãã€ã©ããŒãžã§ã³ãæåã«ãªãªãŒã¹ããå¿ èŠããããŸããïŒ
åžžã«2500ã®æªè§£æ±ºã®åé¡ããããšããäºå®ã¯ãå éšã®è°è«ã§ãããŸã§ã«åºãŠããŸããïŒ
@ ntziolis ã @ zakhenryãèšã£ãããã«ã features
ã圹ç«ã€ãšæããŸã
@ntziolisã©ã€ããµã€ã¯ã«ã§ä»ã®è©Šã¿ãããŸããããPOCãæ©èœããŠããŸãïŒã¯ã©ã¹æ¡åŒµãªãã§ãã©ã€ããµã€ã¯ã«ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŠããŸããïŒã ãã©ã€ããŒãAPIã«äŸåããŠããŸãïŒïŒexclamation :)
@ tonivj5 hahç§ã¯ããªãã®ãœãªã¥ãŒã·ã§ã³ãèªãæ©äŒããããŸããã§ããããç§ã®ãœãªã¥ãŒã·ã§ã³ãã»ãŒãªãªãŒã¹ãããŸãã:) https://github.com/cloudnc/ngx-observable-lifecycle
ç§ãåãçµãã§ããlibã®ã¢ã€ãã¢ã¯ãä»ã®libãç¬èªã®ã©ã€ããµã€ã¯ã«å¯Ÿå¿æ©èœãäœæããããã«ããã¯ã§ããå ±éããŒã¹ãæã€ããšã§ãã åãããã¯ãžã®ã¢ã¯ã»ã¹ãå¿ èŠãšããè€æ°ã®é¢æ°ãããå Žåãã³ã³ããŒãã³ãdefã«è£ 食ãããããã¯ã1ã€ã ãã«ãªãããã«æ©èœããå¿ èŠããããŸãã
ç§ã¯ããããã¹ãŠæ©èœãããŸãããCIãšåäœãã¹ãããœãŒãããå¿ èŠããããŸãã
åžžã«2500ã®æªè§£æ±ºã®åé¡ããããšããäºå®ã¯ãå éšã®è°è«ã§ãããŸã§ã«åºãŠããŸããïŒ
ç¬ã2019幎åã°ä»¥éã2500件ã®æªè§£æ±ºã®åé¡ã¯ãããŸããã
$ github_issue_stats history -i2m -n20 -sangular/angular
+-------------------------+--------------------+
| period | issues |
+-------------------------+--------------------+
| This month (2020-05) | 2855 (+137, -112) |
| Last month (2020-03) | 2830 (+495, -550) |
| 2 months ago (2020-01) | 2885 (+601, -575) |
| 3 months ago (2019-11) | 2859 (+437, -352) |
| 4 months ago (2019-09) | 2774 (+411, -305) |
| 5 months ago (2019-07) | 2668 (+441, -369) |
| 6 months ago (2019-05) | 2596 (+488, -349) |
| 7 months ago (2019-03) | 2457 (+425, -373) |
| 8 months ago (2019-01) | 2405 (+428, -330) |
| 9 months ago (2018-11) | 2307 (+425, -391) |
| 10 months ago (2018-09) | 2273 (+515, -466) |
| 11 months ago (2018-07) | 2224 (+641, -541) |
| 12 months ago (2018-05) | 2124 (+690, -624) |
| 13 months ago (2018-03) | 2058 (+605, -444) |
| 14 months ago (2018-01) | 1897 (+773, -679) |
| 15 months ago (2017-11) | 1803 (+815, -979) |
| 16 months ago (2017-09) | 1967 (+671, -431) |
| 17 months ago (2017-07) | 1727 (+664, -518) |
| 18 months ago (2017-05) | 1581 (+854, -548) |
| 19 months ago (2017-03) | 1275 (+987, -796) |
| 20 months ago (2017-01) | 1084 (+671, -505) |
+-------------------------+--------------------+
ç§ã®å¥œã¿ã§ã¯ãè°è«ãªãã§éãããååé¡ãéãããããžã§ã¯ãããããæ確ãªã³ãã¥ããã£ã®è°è«/ã³ã³ã»ã³ãµã¹ãåŸããããŸã§åé¡ãè°è«ã«éãããŸãŸã«ãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã奜ã¿ãŸãã ãŸããã¡ã³ãããææ¡ãåãå ¥ããå¯èœæ§ãé®æããåã«ãã³ãã¥ããã£ã«æžå¿µäºé ã説æããããã®ã¹ãããã§ããããŸãã
@agalazisãã®åé¡ã¯4幎åã®ééãããŠãããéå»3幎éã¯ã»ãšãã©ç¡èŠãããŠããŸãã
@agalazisãã®åé¡ã¯4幎åã®ééãããŠãããéå»3幎éã¯ã»ãšãã©ç¡èŠãããŠããŸãã
AngularããŒã ã®ã¡ã³ããŒãããªãããã5æ¥åã«ãŸã éããŠããã®ãã説æããŠ
@ etay2000ãããžã§ã¯ãå šäœã®é²åã«åœ±é¿ãäžãããããããã€ãã®æ±ºå®ã¯é£ããå Žåããããããã¯èš±å®¹ã§ããŸããéçºè ã¯ãæéãçµã€ã«ã€ããŠãã®æ©èœã«é Œãããšãã§ããªãããšã«æ°ä»ãããšãã§ããŸãããå¯èœæ§ãããå Žåã¯ããªãææå°æ©ã«ããã殺ãã®ã§ããïŒ ææ¡ãåŽäžããŠåé¡ã解決ããã®ãæãç°¡åãªããšã ãšæããŸãããããã¯çç±ããããŸããã§ããã
@beeman
AngularããŒã ã®ã¡ã³ããŒãããªãããã5æ¥åã«ãŸã éããŠããã®ãã説æããŠããã®ã§ãããªãã¯åã«æ£ãããããŸããã
ããªãã¯æ¬åœã«ãããã®èŠªæãäžã«åããçµµæåã奜ãã§ããïŒ ããã¯æ¬åœã«èª¬æã§ãããïŒ 4幎以äžåŸã圌ã¯åœŒãã決å®ãæ¥ãããããªããšèšããŸããã
@agalazis
ããã€ãã®æ±ºå®ãé£ããããšã«åæããŸããããããã®é£ãã決å®ã延æããããã®èš±å®¹å¯èœãªæéæ ãšèŠãªãããã¹ããã®ã¯äœã§ããïŒ 2855ã®æªè§£æ±ºã®åé¡ã®ãã¹ãŠããããã®é£ãã決å®ã«é¢ä¿ããŠããããã§ã¯ãããŸãããããããã®å€ããããªãåããååšããŠããŸãã
@ etay2000ãããåãå ¥ãããã©ããã¯å¥ãšããŠãããã¯ãªãŒãã³ãœãŒã¹ã®äººã ã§ãããåââé¡ã解決ããã®ã¯ã¡ã³ãããããã¯ããã«å€ãã®ã§ãã ããšãã°ãTypescriptãããžã§ã¯ãã§ã¯ã2åè¿ãã®åé¡ãæªè§£æ±ºã§ãããããã§è¡ã£ãå¥ã®ææ¡ã«ãé·ãæéãããããŸããã ããã§ã®è°è«ã¯ãæ©èœãæã£ãŠããã»ã©æŽŸæã§ã¯ãªãããä»ã®å€ãã®èŠç¹ãèŠãããšãã§ããå€ãã®éžæè¢ããããããã®ã§ãç§ã¯æ°ã«ããŸãã
@agalazisããã§ãããç§ã¯ïŒèª€ã£ãŠïŒGoogleã管çããŠãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«ãå°ããªãããžã§ã¯ããããå€ãã®ããšãæåŸ ããŠãããšæããŸãã
@beemanããã«èŠªæãäžã«åããŠçµµæåãæ¿å ¥ããŸãïŒ-------->
@ etay2000ãã®ãããªéèŠãªæ±ºå®ã¯ãããããäœåäžãã®ãã®ããããžã§ã¯ããããã³äººã ã«åœ±é¿ãäžããããšãåžžã«èŠããŠããå¿ èŠããããŸãã ããã«éèŠãªã®ã¯ãå®å šã§ã¯ãªã決å®ãšãããªãã¯APIã®å°å ¥ã§ããããã®åŸããã«ããã€ãã®é倧ãªå€æŽã«ã€ãªããå¯èœæ§ããããŸãããããã¯åãªãæªå€¢ã§ãã ã»ãŒåPRã§ãåã¹ããããã©ã®ããã«ã¬ãã¥ãŒãããŠãããã確èªã§ããŸããå®å šã§ã¯ãªãå Žåã¯ãæ°é±éãæ°ãæãããã«ã¯æ°å¹ŽåŸ ã€ã ãã§ãã
@agalazisããã§ãããç§ã¯ïŒèª€ã£ãŠïŒGoogleã管çããŠãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«ãå°ããªãããžã§ã¯ããããå€ãã®ããšãæåŸ ããŠãããšæããŸãã
ããããŸãããGoãšdartãèŠãŠãã ããã ã°ãŒã°ã«ã¯å®éã«å幎ééåžžã«äººæ°ã®ããã³ãã¥ããã£ã®èŠæ±ãç¡èŠããããšã§ããªãæåã§ãïŒDäžè¬çã«èšèª/ãã¬ãŒã ã¯ãŒã¯ãªã©ãžã®åœŒãã®ã¢ãããŒãã éåžžã«ä¿å®çã§ãã å°åã«é©åœãããããæ°ããèšèªãã¢ã€ãã¢ãåºçŸããã°ãŒã°ã«ã¯ãŸã äœå¹Žãããããæ¡çšããŠããªãã®ãèŠãããšãã§ããŸãã ãã®çš®ã®ã¢ãããŒãã«ã¯é·æãšçæããããšæããŸãããå°ãªããšãç§ã«ãšã£ãŠã¯ãGoogleãéçºãããã®ã¯ç§ã®ç²Ÿç¥ã«ããŸãåããªããããå¯èœãªéãé¿ããåŸåããããŸãã
ïŒç³ãèš³ãããŸããããçãããç§ã¯ãããããªããã°ãªããŸãããïŒ
@beemanããã«èŠªæãäžã«åããŠçµµæåãæ¿å ¥ããŸãïŒ-------->
@ etay2000ããã§ã®è¡åéåã§ã¯ãªãã«ããŠãããã®çš®ã®ã³ã¡ã³ããã©ã®ããã«åœ¹ç«ã€ã®ãã¯ãŸã£ããããããŸããã 誰ãã芪æãäžããæ¹æ³ãç¥ã£ãŠãããšç¢ºä¿¡ããŠããã®ã§ãç®èã®ãã€ã³ãã¯äœã§ããïŒ
念ã®ããã«èšã£ãŠãããŸãããAngularã®äœ¿çšã匷å¶ãããããšã¯ãããŸããã人ã ãããªãããã£ãšåã°ãããå¥ã®ãã¬ãŒã ã¯ãŒã¯ãèŠã€ããããšãè©Šã¿ãããšãã§ããŸãã
@brunojcmã³ã¡ã³ãèŠå¯ãæ¥ãã®ã§ãããŒãã£ãŒã¯çµãã£ããšæããŸãã éèŠãªã®ã¯ã圌ãç§ã®ä»ã®ãã¹ãŠã®ã³ã¡ã³ããåŠå®ããããšã§ããããç®èãè¡åéåã§ããããšã«æ°ã¥ããŸããã§ããã
念ã®ããã«èšã£ãŠãããŸãããAngularã®äœ¿çšã匷å¶ãããããšã¯ãããŸããã人ã ãããªãããã£ãšåã°ãããå¥ã®ãã¬ãŒã ã¯ãŒã¯ãèŠã€ããããšãè©Šã¿ãããšãã§ããŸãã
ç§ãæ¬åœã«ããã«å¿ããããšæãæ¹æ³ã¯ãééããªãããã®è¡åèŠç¯ã«éåããã§ãããã
å®äºããŸããã誰ããå®æçã«ã¹ã±ãžã¥ãŒã«ãããŠããçªçµã«æ»ãããšãã§ããŸãã ããš4ã5幎åŸã«ããäžåºŠãã§ãã¯ããŠãç¶æ³ãã©ããªã£ããã確èªããŸãã
@ tonivj5 @ zakhenryãããéãããããªããšèããŠããããã§ãã
@mgechevããã¯äºåçãªè°è«ã§ã¯ãªãããšãç解ããŠããŸãããããªãã®èããèããŠ
Vue 3.0ã®ãªã¢ã¯ãã£ãã¢ãžã¥ãŒã«ïŒrefãŸãã¯reactiveïŒãçŽæ¥é©çšããŠããã®åé¡ã解決ã§ãããšæããŸãã
@AnonymousArthurããã±ãŒãž@vue/reactivity
ã«ã€ããŠè©±ããŠããå Žåãããããã£ãžã®åå¿æ§ãæäŸããçžå¯Ÿã¹ããªãŒã ïŒRxJãšã¯ïŒãšã¯é¢ä¿ããªããããããã§èª¬æããŠããå
容ãšã¯ãŸã£ããé¢ä¿ãããŸããã
@gundã¯ããåæããŸãã ãã ãããã®äŒè©±ã«ã¯ããªãé·ãæéïŒ4ã5幎ïŒããããããŸã çµäºããŠããŸããããã®ããããµãã¹ã¯ã©ã€ã/ã¢ã³ãµãã¹ã¯ã©ã€ããŸãã¯ngOnChangeãã³ãã©ãŒãäœæããããªãã¢ã€ãã¢ãããã«ãããã¢ããããŸãïŒããã§ãªãå ŽåããããŸãïŒã RxJSã¯åå¿æ§æ©èœãæäŸãããã®äŒè©±ïŒãã¹ãŠãèªãã§ããŸããã§ããïŒã¯ãå ¥åå€ãæ§æç³è¡£ãšããŠObservableã§ã©ããããŠããããç£èŠã§ããããã«ããããšã«ã€ããŠè©±ããŠããã®ã§ãçŽ æŽãããã¢ã€ãã¢ã ãšæããŸãã
ãã®ã¢ã€ãã¢ã¯æ¬åœã«äŸ¿å©ã§ãæåã®@robwormaldã®ãããã¿ã€ãã¯çŽ æŽãããèŠããŸãããæœåšçãªã¡ãªãããšåœ±é¿ãã©ãã»ã©å°ãªãããéå°è©äŸ¡ããŠãããšæããŸãã
ããã€ãã®æ¬ ç¹ãä¿®æ£ããããã«ããã®ãœãªã¥ãŒã·ã§ã³ãå°ã調æŽããããšãææ¡ããŸãããåºæ¬çã«åãã¢ãããŒãã§ãã
å®çŸ©ããè§åºŠãã³ã¬ãŒã¿@OInput()
ãšã¿ã€ãEventReceiver<T>
延ã³ãObservable<T>
ãè¿œå .value
ã²ãã¿ãŒïŒãªã©BehaviorSubject<T>
ïŒã
芪ã³ã³ããŒãã³ãåŽã§ã¯ã @ robwormaldã®äŸã®ããã«ãäœãå€æŽãããŸããã ããã«Observableå€ãæž¡ãããå Žåã§ãã | async
ãå¿
èŠã§ãã ãŸãã¯ãïŒãã€ãã®ããã«ïŒããã§ãåé¡ãªãã芳å¯äžå¯èœãªã¿ã€ããæž¡ãããšãã§ããŸãã
åã³ã³ããŒãã³ãåŽã§ã¯ã次ã®ããã«ææ¡ããŸãïŒãã®ææ¡ããã®ããããªéžè±ïŒïŒ
@Component({ selector: "child" })
class Child {
// Notice, this parallels the patterns of `@Output()`.
@OInput() foo = new EventReceiver<MyType>();
constructor() {
// The reactive way to listen to input changes in the class.
this.foo.subscribe((v) => {
console.log('foo changed', v);
});
// Or you can bind to `foo | async` in the template.
}
// But this would also support less reactive patterns in parallel,
// both for ease of migration and for cases where developers don't
// want to migrate fully.
ngOnChanges(changes: SimpleChanges) {
if (changes['foo']) {
console.log('foo changed', changes['foo'].currentValue); // Unchanged
console.log('foo changed', this.foo.value); // Previously this would have been just `this.foo`
}
}
}
ããã«ããã®ã¢ãããŒãã®å©ç¹ããããŸããããã¯ãå°ã売ãããŠããªãã£ãããã«æããŸãã
Input
ãšOInput
ã©ã¡ãã䜿çšããŠããããç¥ãå¿
èŠããªãããããã®å€æŽã«ããã³ã³ããŒãã³ãéã®ãã°ã®ãªã¹ã¯ãæé€ãããŸããEventReceiver
ã¯ã takeUntil(ngOnDestroyEvent)
ãéããã€ããå
éšçã«å«ããããšãã§ããŸãããããã£ãŠããããã®ãªãã¶ãŒããã«ã¯èªåçã«å®äºãããããã»ãšãã©ã®å Žåãã³ã³ããŒãã³ããç Žæ£ããããšãã«ç»é²ã解é€ããããšãèŠããŠããå¿
èŠã¯ãããŸããã ã ïŒã¡ã¢ãªãªãŒã¯ãæžããŸããïŒïŒ@Output()
ã®ãã¿ãŒã³ãšéåžžã«ãã䌌ãå€èŠ³ãšæ©èœãåããŠãããããããã€ãã®åªãã䞊ååŠçãšãããããé©åã«æ¥ç¶ããæœåšçãªæ©èœãæäŸããŸããReplaySubject<T>(1)
ã䜿çšããŠåæ¹åãã€ã³ãã£ã³ã°ã®åäœãããã·ãŒã ã¬ã¹ãã€äžè²«ããŠæ¥ç¶ãã@InputOutput()
ãææ¡ããã®ã¯ã¯ãŒã«ã ãšæããŸãã ããããããã«ã¯ç¬èªã®èª²é¡ãšè°è«ãããã®ã§ãããã§ã¯ãããææ¡ããŠããŸããã@Output()
ãšåããããç°¡åã§ããObservable
ãžã®å€æŽã«å¯ŸããŠã·ãŒã ã¬ã¹ã«switch()
ã«ãªããããåãObservableã€ã³ã¹ã¿ã³ã¹ã«åºå·ããªããããªåŒ±ãåå¿ãã¿ãŒã³ã¯ç¹å¥ãªå ŽåïŒ switch()
å¿
èŠã¯ãããŸããã ç§ãéžãã OInput
ãšããååã«ã€ããŠã®è£è¶³ïŒæããã«ãããã¯è°è«ã®äœå°ããããŸãã ããããç§ã¯å人çã«ãã®ååã奜ãã§ãããªããªããããã¯ãObservable Inputãã®ç¥ã§ããããããåæ ããŠãããOutputãã®ããã«èŠããããã§ãã
芪æãªãAngularããŒã ã 2020幎ã«æ¥œãã¿ã«ããŠããããšãæããŠãã ãã:-)
ãŸãã @ jcomputerãœãªã¥ãŒã·ã§ã³ã¯ãŸãã«ç§ãæãã§ãããã®ã§ãã å¥ã®ãã³ã¬ãŒã¿åã®å€§ãã¡ã³ã§ã¯ãããŸãããã @ViewChild
ã«{ read }
ãšåæ§ã®ãã©ã¡ãŒã¿ãè¿œå ããããšã¯å¯èœãããããŸããã äŸãã°ïŒ
@Input({ observable: true })
@Input({ asObservable: true })
@Input({ asSubject: true })
2020幎ã«æ¥œãã¿ã«ããŠããããšããããããããŸããïŒDãã¡ãããããïŒããã³äžèšã®ä»ã®åé¡ïŒããã°ãšããŠã«ãŠã³ããããæ°æ©èœãšããŠã«ãŠã³ããããªãéãã :)
https://twitter.com/ThomasBurleson/status/1283902827467886592
@fxckç§ã¯ããã§äžè©ãªæèŠãæã£ãŠãããããããŸããããæ£çŽãªãšããã2020幎ãAngularããŒã ããã©ãŒã ãã«ãŒã¿ãŒãªã©ã®å€ãã®ãã°ã朰ãããšã決å®ããå Žåãç§ã¯0ã®æ©èœã§ãŸã£ããæã£ãŠããŸããïŒè©ãããããïŒã
ããã¯èšã£ãŠããããã¯æè¿ã®ã€ãã³ãã«é¢é£ããåé¡ã§ããå¯èœæ§ããããAngularããŒã ã§ã¯çŸåšè€éãªããšãèµ·ãã£ãŠãããšæããŸãã ãããŸã§Angularãç©æ¥µçã«æ§ç¯ããŠããçŽ æŽããã人ã ãç¶æããŠãããããšãé¡ã£ãŠããŸãïŒ heart:ã ããããããã¯å¥ã®è©±ã§ãã
ãªããããã¯ã§ããããªããã é£ã³å»ããŸã
@ maxime1992ããã¯ç§ã«ãšã£ãŠã倧äžå€«ã§ãããã
ç§ã¯ããã§äžè©ãªæèŠãæã£ãŠãããããããŸããããæ£çŽãªãšããã2020幎ãAngularããŒã ããã©ãŒã ãã«ãŒã¿ãŒãªã©ã®å€ãã®ãã°ã朰ãããšã決å®ãã幎ã§ããå Žåãç§ã¯0ã®æ©èœã§ãŸã£ããæã£ãŠããŸãã
ããããç§ãç·åŒµãããŠããã®ã¯ãAngularããŒã å ã«ãç§ãã¡ãããªããŠããç§ãã¡ã«åœ±é¿ãäžããé·æçãªäžå¥åº·ãªHRããã»ã¹ããããšããäºå®ã§ãã ç¹ã«ãã®åéãžã®å€§èŠæš¡ãªæè³ã®èŠ³ç¹ããã
ç§ã®POVããã圌ãã¯äž»ã«BOTãä»ããŠããããéããããšã«ãã£ãŠåé¡ãä¿®æ£ããŠããŸã-å¿çãªãã§æ®ãããããã«ãã£ãŠéããŸããã..ïŒ-/
@ montella1507ããããããã¯æ£ç¢ºã«ã¯
AngularããŒã ãéé£ããæ©èœãå€æŽãããã«åŸãããªãããšã«äžæºãæã£ãŠãã人ã®ããã«ïŒ
ç§ã¯ããªãã®çã¿ãç解ããŠããŸãã ãŸãããã®æ©èœãAngularã§èŠãããšæã£ãŠããŸãããŸããå人çã«å«ããªãã®ãããããå€æŽããããšæããŸãã
ããããAngularã¯ããã¹ãŠã®å æ²¢ã®ããæ°ããããã¡ããåãããªãªãŒã¹ããšã«å€§éã®æ©èœãåãããã¬ãŒã ã¯ãŒã¯ãæå³ãããã®ã§ã¯ãªããããããŸããã ãããŠãããã¯ç§ã«ãšã£ãŠã¯åé¡ãããŸããã ãããšã³ã¿ãŒãã©ã€ãºã¬ãã«ãç®æããå®å®æ§ãšä¿¡é Œæ§ãæäŸãããã¬ãŒã ã¯ãŒã¯ãå¿ èŠã§ãã ãããŠãAngularã¯ãå°ãªããšãç§ã®çµéšããã¯ããããããŸããã£ãŠããŸãã
ç§ã¯Vueããã£ãšå¥œãã§ãã ç§ã¯ãããå人çãªãããžã§ã¯ãã«äœ¿çšããŠããŸãã ããããç§ã®ãããžã§ã¯ãã¯ããã«æ代é ãã«ãªãå§ããæ°ããã³ã³ããŒãã³ãã¹ã¿ã€ã«ã«ã¢ããã°ã¬ãŒãããããšããè¡åãæããŸãã ãŸããç§ãã¢ããã°ã¬ãŒããè¡ããšããç©äºã¯åžžã«æãå¥åŠãªæ¹æ³ã§å£ããŸãã ãšã³ã·ã¹ãã ã¯ãŸããäºææ§ãç¶æããã®ã«èŠåŽããŠããããã§ãã
å¯Ÿç §çã«ãAngularã¯æçããŠããŠå®å®ããŠããŸãã é »ç¹ã«å€æŽãããããšã¯ãããŸããããäŸåé¢ä¿ãææ°ã®ç¶æ ã«ä¿ã€ãããã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ã®äœæ¥ãå°ãªããªãããšãæå³ããŸããããã¯ãåçšè£œåã«ãšã£ãŠäŸ¡å€ããããŸãã ããªãã®ç¥èã¯ãŸããããé·ãé¢é£æ§ãä¿ã¡ãè¿œãã€ãããšãè©Šã¿ã代ããã«ãããªãã¯æ·±ãè¡ãããšãã§ããŸãã
@manfreedã®äººã ã¯ãå æ²¢ã®ããæ°ããããã¡ããæ±ããŠããã®ã§ã¯ãªãããã¬ãŒã ã¯ãŒã¯ã®èšèšã«ãããèŠèœãšãã®ä¿®æ£ãæ±ããŠããŸãã çŸåšãäž»èŠãªæ©èœã®ããã«ããªãã¶ãŒããã«ã䜿çšããããåŸãªãå Žåãããã°ããªãã¶ãŒããã«ã䜿çšã§ããªãå ŽåããããŸãã 芳枬éãå«ããªäººã¯æ¬²æ±äžæºã§ãã ãªãã¶ãŒããã«ãæãã人ã¯æ¬²æ±äžæºã§ãã ãããŠãç§ãã¡ã®å€ãã¯ãç§ãã¡ãè«ŠããŠä»ã®ãã¬ãŒã ã¯ãŒã¯ã«ç§»ã£ãç¶æ³ã«ãšãŠã倱æããŸããã å°ãæ¹åæ§ã®ããAngularã䜿ãç¶ããããšæã£ãŠããã®ã§ãæ¬åœã«çŽ æŽããããã¬ãŒã ã¯ãŒã¯ã§ãã£ãå¯èœæ§ããããŸãã ãããã管çãã¹ãå®çšäž»çŸ©ã®æ¬ åŠãèŠèœãšãã«ã€ããŠã®ããã°æçš¿ã¯ããã¹ãŠå®¢èŠ³çã«å€±æããŠããŸãã
@insidewhyèŸæ±åŒ·ããéè·¯ã«ã¯åžžã«å±±ãšè°·ãããã€ããããŸãããããã¯ä»ã®äººã«ããããããªãããšããããã€ãã®äž»èŠãªééããããããšãæå³ãããã®ã§ã¯ãããŸããã ããã¯ãç©äºãå®éãããéãå¹æçã«åé²ã§ããããšãæå³ããã ãã§ãã
ããŒããããã«ã¯åè¿°ã®ç¹å®
ç§ã¯åœŒãã«çãã®å©çãäžãããã®äžçšåºŠã®ããŒããããã®èšäºã®ã³ã¡ã³ãã§ããã³ã³ã®å¿çãå°ããŸããïŒ
圌ã¯æ°ã¶æåã«ããã§åœŒãèšã£ãããšãããªãç¹°ãè¿ããŸããããããã®rxjsé¢é£ã®åé¡ã®ã©ããããã«ä¿®æ£ãããŠããªãã®ã§ãããã§ãã
ç§ã¯èªåã®äž»åŒµãç解ããããšããŸããããæåŸã«ããäžåºŠè©ŠããŠã¿ãŸããã
ãããã®äžäœäºææ§ãå£ããåŠç¿æ²ç·ãå¢ãããä»ã®APIãšäžè²«æ§ããªããããã©ãŒãã³ã¹ã«
- 芳å¯å¯èœãªã©ã€ããµã€ã¯ã«
- 芳å¯å¯èœãªå ¥å
- 芳å¯å¯èœãªãã³ãã¬ãŒãã€ãã³ã
@insidewhyèŸæ±åŒ·ã
ã¬ãŒã¹ã§å€ãã®ç«¶æè ã泚ç®ãéããŠããå Žåã5幎以äžã®å¿èã人ã ã«æ±ããããšã¯ããã»ã©çŸå®çã§ã¯ãããŸããã
@ insidewhyããã¯ãããäžè¬çã«æå³ããŸããã
@fxck Googleã«ã¯ïŒç§ã®æåŸã®æ°ã§ã¯ïŒ4000åã®ã¢ããªãçµã¿èŸŒãŸããŠãããæ¬è³ªçã«éåžžã«äŒŒãŠããŸãããããã®ãããžã§ã¯ããšãã¢ã¬ãã¥ãŒã®åãæ¿ãã¯ïŒç§ãæ³åããéãïŒéåžžã«ã·ãŒã ã¬ã¹ã§ãã ç§ã®äŒç€Ÿã§ãããAngularã®å€§ããªå©ç¹ã®1ã€ã¯ãä»ã®ããŒã ã®ã³ãŒããã¬ãã¥ãŒããªããŠãããã¢ã¬ãã¥ãŒã調æ»å šäœãéå§ããªãç¶æ ã«ããããšãç¥ã£ãŠããããšã§ãã
ããã§ããããã®äŸ¿å©ãªRxJSã·ã§ãŒãã«ããã®ãããããã³ã¢ã«å®è£ ãããšããŸããããã§ã¯ã©ããªããŸããïŒ ç¹å®ã®ã±ãŒã¹ã§ã©ã¡ãã®ãã€ã¢ã¹ãæ£ããããæ確ã«ç€ºãããšãªããæç¶ãåãã€ã¢ã¹ãšåå¿åãã€ã¢ã¹ãçºçããå¯èœæ§ããããŸãã ãããŸã§ã®è°è«ãèªãã åŸãAngularããŒã ããã®çãã¯ãããã¯åªå 床ãäœããã§ã¯ãªãïŒããªãã®æµãã瀺åããŠããããã«ïŒãå®éã«ã¯ãç§ãã¡ã¯å³æ¹ã«ãªããããªããã«è¿ãããã§ãã
ããã§ã®Angularã³ãã¥ããã£ã®äžçŽRxJSãŠãŒã¶ãŒã¯ã声ã®å°æ°æŽŸã§ããTypescriptãDIããã³ãã¬ãŒããããã³Angularã®ããŸããŸãªã©ã€ãã©ãªãååŸããåŸããã¬ãŒã ã¯ãŒã¯ãæ¯æ¥äœ¿çšããŠã»ãŒ1幎ãçµéããæºåãæŽããŸããã RxJSãå®å šã«ç解ããã ãã¢ã¬ãã¥ãŒã§äžçŽã¬ãã«ã®äººã ã«åå¿æ§ã®åèŠãæãããããšã¯ã人ã ãããã«é ãããŸããããã¯æåéããAngularãå¿ èŠãšããæåŸã®ããšã§ãã
Angularã®ç®æšã¯ïŒç§ãèŠãŠããããã«ïŒããX techã䜿çšããæ¹ãè¯ãã®ã§ãããã«çãå°èª¬ããããŸããããé¢ããŠäŒè©±ãæžããã調æŽããå®è£ ãããŠããããžãã¹ããžãã¯ã«é¢ãããã¢ã¬ãã¥ãŒã§äŒè©±ãç¶ããããšã§ãã ã³ã³ããŒãã³ãããAdvancedãAngularãšãBeginnerãAngularã®éã§ããã§ã«æã£ãŠãã以äžã«éå±€åããå¿ èŠããããŸããïŒ
ããã¯ãç¶æ 管çã§èŠãã®ãšã»ãŒåãè°è«ã§ãããAngularã¯ãèããããå€ãã®ãã¿ãŒã³ããã©ããæ£ããããå€æããå¿ èŠãããã®ã¯ãªãã§ããïŒ
è§åºŠã®ããããŒã ã¡ã³ããŒã®1人ãåŒçšãããŠãã ããã
ã¡ãªã¿ã«ããããã®ãããã«ã€ããŠããŸã£ããé²ãã§ããŸããïŒèŠ³å¯å¯èœãªã©ã€ããµã€ã¯ã«ã芳å¯å¯èœãªå ¥åã芳å¯å¯èœãªãã³ãã¬ãŒãã€ãã³ãïŒã
ããã¯ãç¶æ 管çã§èŠãã®ãšã»ãŒåãè°è«ã§ãããAngularã¯ãèããããå€ãã®ãã¿ãŒã³ããã©ããæ£ããããå€æããå¿ èŠãããã®ã¯ãªãã§ããïŒ
ç¶æ 管çãšããã®éãã¯ãç¶æ 管çã¯ã³ãã¥ããã£ã«ãã£ãŠå®è¡ã§ããããšã§ãããè§åºŠã®ããã³ã¢ã®å éšã«ã¯ããã劚ãããã®ã¯äœããããŸããã æ®å¿µãªãããAngularã¯ãç§ãèšåãã3ã€ã®ãã¡ã©ã¡ããé©åã«å®è£ ããæ¹æ³ãæäŸããŠããŸããã ïŒç·šéïŒã³ã¡ã³ããžã®ãªã³ã¯ãä¿®æ£ïŒ
ãã©ãŒã ãã«ãŒã¿ãŒããã¬ãã¯ã¹ã¬ã€ã¢ãŠãããŠãããŒãµã«ãªã©ã®ããã±ãŒãžãå«ããå¯èœãªéãã³ãã¥ããã£ã«ä»»ããããšã«å¿ããæè¬ããŠããŸããAngularããŒã ãã³ã¢ãCLIãã³ã³ããŒãã³ãã«éäžã§ããããã«ããŸãã ãã ãããã®ããã«ã¯ãããšãã°é«æ¬¡ã³ã³ããŒãã³ããèš±å¯ãããªã©ãã³ãã¥ããã£ã«ååãªãšã³ããªãã€ã³ããæäŸããå¿ èŠããã
ãããŸã§ã®è°è«ãèªãã åŸãAngularããŒã ããã®çãã¯ãããã¯åªå 床ãäœããã§ã¯ãªãïŒããªãã®æµãã瀺åããŠããããã«ïŒãå®éã«ã¯ãç§ãã¡ã¯å³æ¹ã«ãªããããªããã«è¿ãããã§ãã
ã¯ããæãã§ãã
@fxckç§ãã¡ã¯ããã«ã€ããŠåãããŒãžã«ãããšæããŸãã ãã©ãŒã©ã ã§ããããã¯ååã®ãšã³ãžãã¢ãšäžç·ã«RxJSã玹ä»ãããã³ã«ãåŒçšã§ããåŒçšã®ã»ãšãã©ã¯ããŸã ç解ã§ããŠããŸãããã©ãããã°ãã£ãšåŠã¶ããšãã§ããŸããïŒããšèšããŸãã ãŸãã¯ããªãã¬ãŒã¿ãŒã®æ°ãå§åçã ãšæããŸããã ãŸãã¯ããã®PRã§ãã®ãã€ãã©ã€ã³ãèªã¿åãã®ã«åé¡ããããŸããã 粟éããRxJSãšã³ãžãã¢1人ããšã«ãçãã²ããã15人ã®ç²ŸéããAngularãšã³ãžãã¢ãããããã§ãã
ã¯ããæãã§ãã
ããã¯å°ãåæ²çã§ãããããã®ãã¿ãŒã³ãæã€ããã«@angular/core
ããå¿
èŠããšã¯ããŸãããå®éããã®åé¡ã«ã¯ãä»æ¥ã©ã®ãããžã§ã¯ãã§ã䜿çšã§ããå€ãã®ããªã¢ã³ããšã©ã€ãã©ãªããããŸãã åè¿°ã®ãªãã·ã§ã³ã䜿çšããéã®å¯äžã®èºèºã¯ãå°æ¥ãAngularãæšæºã®@angular/core
代æ¿åãšããŠæäŸãããã®ã«ç§»è¡ããªããã°ãªããªãå¯èœæ§ãããããšã§ãã npm uninstall
ããã¹ãŠã®typescriptãšã©ãŒãä¿®æ£ããã®ã¯æ¬åœã«é£ããã§ããïŒ
ãã¹ãŠã®è§åºŠã®ãããããžã§ã¯ãã«åœ±é¿ãåãŒããããããæ©èœããªãå Žåã¯ææžåããŠç§»è¡ããã®ã«æ°ãåããªãã»ã©ã®æéãå¿ èŠãšããäž»èŠãªã¢ãŒããã¯ãã£äžã®æ±ºå®ã¯ãããã«æãããããã«æããŸãã
ããã¯å°ãåæ²çã§ãããããã®ãã¿ãŒã³ãæã€ããã«@angular / coreããå¿ èŠããšã¯ããŸãããå®éããã®åé¡ã«ã¯ãä»æ¥ã©ã®ãããžã§ã¯ãã§ã䜿çšã§ããå€ãã®ããªã¢ã³ããšã©ã€ãã©ãªããããŸãã
ããããå®éã«ã¯ããã§ã¯ãããŸãããåãœãªã¥ãŒã·ã§ã³ã«ã¯ããã¯ãå¿ èŠã§ããããå€æŽãããå¯èœæ§ã®ããå éšAPIã«äŸåããŠããŸãã ãããå šäœã®ãã€ã³ãã§ãã @ insidewhyãhttps://github.com/angular/angular/issues/5689#issuecomment -630661006ãšèšã£ãããšãšããã³ãã¬ãŒãã€ãã³ãã¹ããªãŒã ã«ã€ããŠãã®äžã§èšã£ãããšãèªãã§
//ä¿®æ£ããããªã³ã¯ãç·šéããŠã³ã¡ã³ãããŸã
ããããå®éã«ã¯ããã§ã¯ãããŸãããåãœãªã¥ãŒã·ã§ã³ã«ã¯ããã¯ãå¿ èŠã§ããããå€æŽãããå¯èœæ§ã®ããå éšAPIã«äŸåããŠããŸãã
ã³ãã¥ããã£ãããã«å¯ŸåŠã§ããããã«ããã«ã¯ãã©ã®å éšAPIãŸãã¯ã¿ã€ãããããªãã¯/ãžã§ããªãã¯ã«ããå¿ èŠããããšæããŸããïŒ æ確ãªåé²ã®éããªãããã«ãã®ãã¶ã€ã³ãåŸ æ©ãã¿ãŒã³ã«ããå Žåã¯ããã®åããã©ã ã絶ããå©ãã®ã§ã¯ãªããç¬èªã®ãã¶ã€ã³ãèš±å¯ããããã«äŸé Œããã®ãé©åã ãšæãããŸãã
@insidewhyãã³ã¢å ã§ãããå®è¡ããããšããä»ã®ã³ã¡ã³ããèªãã§ãã ããã
@fxckãããã³ã¢ã«å®è£ ããè©Šã¿ã®æŽå²ãããã®åé¡ã5幎éã©ã®ããã«éãããŠãããã«ã€ããŠã¯èª¬æããŸããããã³ãã¥ããã£ãèªåã§ãã¶ã€ã³ãéçºã§ããããã«ããããã«å éšãéæŸããããšã
Yo @insidewhy ãããã¯ããªãã®
ãããã㣠'serviceStackId $'ã¯ãåæåã®åã«äœ¿çšãããŸããtsïŒ2729ïŒ
Yo @insidewhy ãããã¯ããªãã®
ããããããã¯ãã³ãã¬ãŒãã³ã³ãã€ã©ã«ãããŸããã ããã¯å¥ã®ããšã§ãã ããã ãŸãã ä¿®æ£ããŠã¿ããå Žåã¯ãã¡ã³ãããªã¹ãã«è¿œå ã§ããŸãã
@fxckå®éã«ã¯ããã³ã¬ãŒã¿ããŒã¹ã®ããããã£ã¯ã³ã³ã¹ãã©ã¯ã¿ãå®è¡ããããŸã§æ³šå ¥ãããªããããngOnInitã§ãã®ãã€ãæŒç®åãå²ãåœãŠãå¿ èŠããããŸããããã¯ãå®éã«ã¯ã³ãŒãã®æ£åœãªåé¡ã§ãã
@insidewhyç§ã¯ééããªãTS4ã®åã«ä»äºãããŸããã ãããŠããããã§ãã¯ã
function ObservableInput() {
return (target: any, propertyKey: any) => {
Object.defineProperty(target, propertyKey, {
set(value: any) {
console.log(target, propertyKey, value);
},
get() {
return 'ObservableInput modified value';
},
})
}
}
class Foo {
@ObservableInput()
bar = 'original bar value';
baz = this.bar;
constructor() {
console.log('loggging this.baz', this.baz);
}
}
new Foo();
ãã°ã«èšé²ããŸã
this.bazObservableInputã®å€æŽãããå€ããã°ã«èšé²ããŸã
ãããã£ãŠãTS4ã§ã®ã¿ããã®ãã³ã¬ãŒã¿å
ã«å€ãæã€get
ãããããšã«æ°ä»ããªããããã³ã³ãã€ã©ãæå¥ãèšãã ãã§ãããã¯ãŸã æ©èœããã¯ãã ãšæããŸãã
ãã³ã¬ãŒã¿ã䜿çšããŠå ¥åããããã®å€æŽãæ€ç¥ããå ¥åããããã®èŠ³å¯å¯èœãªããŒãžã§ã³ãäœæããŠããŸãã ãã®codesandboxãã¢ãåç §ããŠãã ããã
ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
// subjectize.ts
export function Subjectize(keyToWatch: string): PropertyDecorator {
return (proto: any, propKey: string) => {
const internalKey = Symbol(keyToWatch);
Object.defineProperties(proto, {
[keyToWatch]: {
get() {
return this[internalKey];
},
set(value) {
this[internalKey] = value;
this[propKey].next(value);
}
}
});
};
}
// counter.component.ts
import { Component, Input } from "@angular/core";
import { ReplaySubject } from "rxjs";
import { Subjectize } from "./subjectize";
@Component({
selector: "app-counter",
templateUrl: "./counter.component.html",
styleUrls: []
})
export class CounterComponent {
@Input()
count: number;
@Subjectize("count")
count$ = new ReplaySubject(1);
}
@wmaurerãææããããã«ã @Subjectize
ã¯ãç©äºãæãéããããã®ãç ç³ããšããŠæ±ãããšãã§ããŸãã
Angularã®å
¬åŒã¬ã€ãInterceptinputããããã£ã®å€æŽãã»ãã¿ãŒã§èªã䟡å€ããããŸããããã¯ã getter/setter
ã䜿çšããŠå
¥åã®å€æŽãæ€åºã§ããããšã説æããŠããŸãã
@hankchiutwãã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ã®@BindObservable
ãã³ã¬ãŒã¿ã«äŒŒãŠããŸãïŒ //github.com/PSanetra/bind-observable#usage
ããããšã@hankchiutw
ReplaySubjectã1ã§åæåããŠããã®ã§ã代ããã«BehaviorSubjectã䜿çšããããšã«ããŸããã
ãŸããSubjectizeã§å€ãçŽæ¥åæåããŸããã
export function Subjectize<T>(keyToWatch: string): PropertyDecorator {
return (target: Object, propKey: string) => {
const internalKey = Symbol(keyToWatch);
Object.defineProperties(target, {
[keyToWatch]: {
get(): T {
return this[internalKey];
},
set(value: T) {
this[internalKey] = value;
if (this[propKey]) {
this[propKey].next(value);
} else {
this[propKey] = new BehaviorSubject(value);
}
}
}
});
};
}
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'rol-bla',
templateUrl: 'bla.html',
styleUrls: [ 'bla.scss' ]
})
export class BlaComponent implements OnInit {
@Input() world: World;
@Subjectize<World>('world') world$: BehaviorSubject<World>;
// ...
}
é¢é£ããããããã£ããã¿ã€ããæšæž¬ã§ããã¯ããªã®ã§ããSubjectizedãããããã£ã«ã¿ã€ããèšè¿°ããªãããã«ããããšæããŸã:(ãããè¡ãæ¹æ³ã¯ãããŸããïŒ
倢ã¯ãããå®è¡ããé¢é£ãããµããžã§ã¯ãããããïŒç§ã®å Žåã¯world $ïŒãBehaviorSubjectãšããŠèªåçã«äœæã§ããããã«ããããšã§ãã
export class BlaComponent implements OnInit {
@Input() @Subjectize() world: World;
// ...
}
@mparpaillonææ¡ãããèšèšã¯ã httpsïŒ//github.com/PSanetra/bind-observableã§è¡ãããŠããæ¹æ³ãšã»ãŒåãã§ã
å¯äžã®éãã¯ã @BindObservable()
ãã³ã¬ãŒã¿ãå
éšã§ReplaySubjectã䜿çšããããšã§ãã ãããã£ãŠããã®ãµããžã§ã¯ãã«åæå€ãå«ããå Žåã¯ããã€ã³ããããããããã£ãæ瀺çã«åæåããå¿
èŠããããŸãïŒããããã£ã¿ã€ãã§æªå®çŸ©ãŸãã¯nullå€ãèš±å¯ãããŠããªãå¯èœæ§ããããããæªå®çŸ©ã®å Žåãåæ§ã§ãïŒã
@Component({
selector: 'app-my-component',
templateUrl: './my-component.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class MyComponentComponent {
@Input()
@BindObservable()
counter: number;
counter$: ReplaySubject<number>;
}
@PSanetraã«æè¬ã
@mparpaillonå¥ã®ãã¢ã§ããªãã®å€¢ïŒhaïŒã®ããã«äœããè©ŠããŸããã
䜿çšæ³ã¯æ¬¡ã®ããã«ãªããŸã
export class CounterComponent {
@Input()
@Subjectize()
count: number;
@Input()
@Subjectize("myCount$")
anotherCount: number;
}
ããã§ããµããžã§ã¯ããããããããåãæå®ããããšãéžæã§ããŸãã
æè¡çã«ã¯å®çŸå¯èœã§ãããéçºè ã«ãšã£ãŠã¯ãããŸãã«ãªãå¯èœæ§ããããŸãïŒæ°ããã¯ã©ã¹ã¡ã³ããŒãå éšã§äœæãããããïŒã
ããããšã@hankchiutw ïŒ Typescriptã§ã¯count $ãmyCount $ã䜿çšã§ããªãããã§ãã
ãŸããããªãã¯ææ§ãã«ã€ããŠæ£ãããããããŸãã...ããããšã
Typescriptã§ã¯count $ãmyCount $ã䜿çšã§ããªãããã§ãã
ã¯ã©ã¹ã¡ã³ããŒããcountãããã³ãanotherCountããšããŠå®£èšããããããmyCount $ãããã³ãcount $ãã«ã¢ã¯ã»ã¹ã§ããŸããã ããªããã©ãã«ã宣èšããªãã£ãã®ã§ããããã¯åã«ååšããŸããã
ç§ã¯ç¥ã£ãŠããŸã...ããããã€ã³ãã§ãã ãã³ã¬ãŒã¿ãããããã宣èšããæ¹æ³ãæ¢ããŠããŸããã @hankchiutwã¯è§£æ±ºçãæäŸããŸããããããŠç§ã¯ããããã®ãŸãŸã§ã¯æ©èœããŠããªããšèšã£ãŠããã ãã§ã
@mparpaillonã¯ç§ã®è§£æ±ºçãèŠãŠãã ããïŒ //github.com/Futhark/ngx-observable-input
@FutharkãããæãïŒ ã©ãã
æãåèã«ãªãã³ã¡ã³ã
芪æãªãAngularããŒã ã 2020幎ã«æ¥œãã¿ã«ããŠããããšãæããŠãã ãã:-)
ãŸãã @ jcomputerãœãªã¥ãŒã·ã§ã³ã¯ãŸãã«ç§ãæãã§ãããã®ã§ãã å¥ã®ãã³ã¬ãŒã¿åã®å€§ãã¡ã³ã§ã¯ãããŸãããã
@ViewChild
ã«{ read }
ãšåæ§ã®ãã©ã¡ãŒã¿ãè¿œå ããããšã¯å¯èœãããããŸããã äŸãã°ïŒ