2017-12-04 23 views
8

私はAngularの相対初心者です。ng-bootstrapプロジェクトから読んでいるソースを理解するのには苦労しています。 The source code can be found hereObservable関数で.call()をなぜ呼び出すのですか?

私はngOnInitのコードで非常に混乱しています:

ngOnInit(): void { 
    const inputValues$ = _do.call(this._valueChanges, value => { 
     this._userInput = value; 
     if (this.editable) { 
     this._onChange(value); 
     } 
    }); 
    const results$ = letProto.call(inputValues$, this.ngbTypeahead); 
    const processedResults$ = _do.call(results$,() => { 
     if (!this.editable) { 
     this._onChange(undefined); 
     } 
    }); 
    const userInput$ = switchMap.call(this._resubscribeTypeahead,() => processedResults$); 
    this._subscription = this._subscribeToUserInput(userInput$); 
    } 

これらの観察可能な機能に.call(...)を呼び出すのポイントは何ですか?これが達成しようとしているのはどのような振る舞いですか?これは正常なパターンですか?

Angular教育の一環としてObservables(意図しない言い回し)について多くの読書/視聴を行ってきましたが、このようなことは一度もありませんでした。任意の説明は、私が

const inputValues$ = _do.call(this._valueChanges, value => { 
    this._userInput = value; 
    if (this.editable) { 
    this._onChange(value); 
    } 
}); 

が私の意見では、それはいつものパターン(私はそれが同じパターンだと思いますが、別の形で書かれている)ではありません

const inputValues$=this._valueChanges.do(value=>{ 
this._userInput = value; 
    if (this.editable) { 
    this._onChange(value); 
    } 
}) 

と同等であると仮定し

答えて

1

は、まずあなたが「コール」事前に定義されたJavaScript関数法を見ていることができ、それを理解するために、そのコンテキストを "myObject"に変換します。

同様に、この呼び出しの理由は、以下の「コール」:

const inputValues$ = _do.call(this._valueChanges, value => { 
    this._userInput = value; 
    if (this.editable) { 
    this._onChange(value); 
    } 
}); 

コンテキスト「this._valueChanges」を提供しているだけでなく、その文脈上のベースと呼ばれる機能を提供する、すなわち、第2でありますパラメータは、使用している例では匿名関数

value => { 
    this._userInput = value; 
    if (this.editable) { 
    this._onChange(value); 
    } 
} 

  • これです。_valueChangesは、イベント入力が発生するたびに影響を与える、それが観察源(観察可能なイベント)

のミラー観測返しイベントObserverable

  • _do.callは、いくつかの側面を行うためであり、入力されUPDATED 例コード:do呼び出しについてhttps://plnkr.co/edit/dJNRNI?p=preview

    あなたは、このような観測でそれを呼び出すことができます。

    const source = Rx.Observable.of(1,2,3,4,5); 
    const example = source 
    .do(val => console.log(`BEFORE MAP: ${val}`)) 
    .map(val => val + 10) 
    .do(val => console.log(`AFTER MAP: ${val}`)); 
    const subscribe = example.subscribe(val => console.log(val)); 
    

    この場合、あなたは、コンテキスト「観察可能」として最初のパラメータを渡す必要はありません。

    しかし、あなたが言ったようにそれを自分の場所から呼び出すときには、最初のパラメータを呼び出して "Observable"として渡す必要があります。それは違う。

    あなたが自身の場所からそれを呼び出すにしたくない場合は@Fanチャンは、上述したように、あなたは次のようにそれを行うことができます混乱何

    const inputValues$=this._valueChanges.do(value=>{ 
        this._userInput = value; 
        if (this.editable) { 
        this._onChange(value); 
        } 
    }) 
    
  • +0

    、 'do'は通常観察可能で呼び出されていることですそれだけではありません。この答えは私にとって事をより明確にしてくれませんでした – CodyBugstein

    +0

    Observableで「Do」が呼び出されました:Observableはイベントのストリームです。私たちがそれに「do」を呼ぶと、それはそのイベントを購読して、イベント発生時まで –

    +1

    私はあなたのための例を持っています:https://plnkr.co/edit/dJNRNI?p=preview。それを実行すると、コンソールでより明確に見ることができます –

    0

    をいただければ幸いです観察できるように働くコード内_doは()の引数としてコールバックを取るスタンドアロン機能として使用され、私の個人的な意見は、彼らが前RxJSのためにこれを使用していたということです

    https://github.com/ReactiveX/rxjs/blob/master/src/operator/do.ts

    4

    観察可能なソースの範囲にバインドされるために必要とされています5.5ではlettable演算子が導入されました。同じスタイルがAngularによって内部的に使用されます。例:https://github.com/angular/angular/blob/master/packages/router/src/router_preloader.ts#L91

    これは、デフォルトでObservableクラスをrxjs/add/operators/XXXにパッチする必要があるためです。これの欠点は、一部のサードパーティのライブラリが、アプリケーション内の他の場所で予期せず問題を引き起こす可能性のあるグローバルオブジェクトを変更していることです。 https://github.com/ReactiveX/rxjs/blob/master/doc/lettable-operators.md#whyを参照してください。

    ファイルの先頭に、それぞれの演算子を個別にインポートすることができます。https://github.com/ng-bootstrap/ng-bootstrap/blob/master/src/typeahead/typeahead.ts#L22-L25

    したがって、.call()を使用すると、任意の演算子を使用できますが、Observableクラスへのパッチ適用を避けることができます。

    var person = { 
        firstName:"John", 
        lastName: "Doe", 
        fullName: function() { 
         return this.firstName + " " + this.lastName; 
        } 
    } 
    var myObject = { 
        firstName:"Mary", 
        lastName: "Doe", 
    } 
    person.fullName.call(myObject); // Will return "Mary Doe" 
    

    「コール」を呼び出すの理由は「人」オブジェクト内の関数を呼び出すためにあるとパス:

    関連する問題