1

次のコードをangular2で切り捨てました。 urlはaspectedとして与えられているものとして動作しています。 chrome.tabs.queryの非同期コールバックを実行しないでprocessTabを実行するとします。それは完全に動作しますが、私がコールバック内で実行する場合。値はprocessTab関数に渡されていますが、正しく機能していません。 chrome.tab.queryの生成値でObservableが期待どおりに動作していませんでした。

randomFunction() { 
    this.processTab("www.whateverurl.com"); 

} 

processTab(url:string) { 

    this.listService.getData(url) 
       .subscribe(
        data => this.data = data, 
        error => this.errorMessage = <any>error); 
    console.log("the url: " + url); 

} 

が、値は両方のインスタンスでprocessTabに渡される:

は**

randomFunction() { 
    var self = this, 
     curl:string; 

    chrome.tabs.query({currentWindow: true, active: true}, function(tabs){ 
     // self.updateUrl = tab.url.replace(/.*?:\/\//g, "") 
     curl = tabs[0].url.replace(/.*?:\/\//g, "").replace(/\/$/, ""); 
     self.processTab(curl); 
    }); 



} 

processTab(url:string) { 

    this.listService.getData(url) 
       .subscribe(
        data => this.data = data, 
        error => this.errorMessage = <any>error); 
    console.log("the url: " + url); 

} 

作業を動作しません。

答えて

0

chrome.tabs.queryはzone.jsに含まれていないと仮定します。あなたは、このモデルは

class SomeClass { 
    constructor(private zone:NgZone) {} 

    randomFunction() { 
     curl:string; 

    chrome.tabs.query({currentWindow: true, active: true}, (tabs) => { 
     this.zone.run(() => { 
     // this.updateUrl = tab.url.replace(/.*?:\/\//g, "") 
     curl = tabs[0].url.replace(/.*?:\/\//g, "").replace(/\/$/, ""); 
     this.processTab(curl); 
     }); 
    }); 

    ... 

    } 
} 

もそんなにありがとう代わり

+0

selfの矢印機能を好む変更検出変化検出のためのAngularsゾーン内で明示的に実行するコードを作成する必要があります。私は週末にそれを理解しようと過ごしました。これは初めてAng 2の外部機能を使って作業していましたが、7月から作業していましたが、zone.jsを実際に見たことはありませんでした。私はあなたの答えのためにそれを習得できるように私はそれを調べています。再び。あなたは私の年齢を保存しようと時間を節約した。また、矢印の機能に感謝します。私は今もそれを好む。 javascriptの名前空間の考え方に詰まっていました。 ;) –

+0

通常、あなたはAngular2がゾーンを使用していることに気づいていません。ほとんどの非同期API( 'addEventListener'、' setTimeout'、...)はパッチが適用され、そのようなイベントが発生したときにAngularが通知され、広告はこれを使って変更検出を実行します。あなたのケースのように扱われないイベントや、外部のライブラリがAngular以外で初期化されて使用される場合、Angularは何らかの助けを必要とします。イベントハンドラがモデルを変更するだけであれば、http://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manualが実行する可能性がありますが、他のコード –

+0

( 'router.navigate(.. ) ')これらは十分ではないかもしれません。 'zone.run(...)'はすべての場合に有効です。 –

関連する問題