2016-07-07 57 views
4

在AngularJS 1.5之前,在指令或視圖中,確保更改的方法將由角度(使用$ digest循環)從第三方異步回調發出時拾取將在$scope.$apply()調用中運行您的代碼。AngularJS 1.5組件中的第三方異步回調組件

就我所知,其中的組件就是擺脫$scope,只是將模板綁定到組件的控制器。我試圖轉換到編寫組件而不是視圖,而不依賴$ scope。比方說,我有以下代碼:

function CompController(TPApi) { 
    let self = this; 
    this.endCallback = false; 
    TPApi.call(data,() => this.endCallback = true); 
} 

angular.module('app', []).component('myComp', { 
    controller: CompController, 
    template: '<div><span ng-show="$ctrl.endCallback">Callback Called</span></div>' 
}) 

這裏的問題是,ng-show是雙重綁定到控制器,但沒有使用$範圍$申請()回調,變化不會回升因爲$摘要循環不會被觸發,所以由ng顯示。這非常麻煩,因爲我不得不在控制器中注入$ scope,並調用$ apply,但是這首先破壞了依賴$ scope的目的。

我想一種方法是將TPApi與$q服務封裝在一起,從而確保在發出回調時調用$ digest循環。但是如果在某個時候我想轉換到使用新的本地Promise API而不是$q

有沒有一種聰明的方式來做到這一點,而不觸發$摘要或角1因爲$範圍和$摘要只是固有的缺陷?

+0

你能在小提琴中重現這種行爲嗎?您的示例行爲正常,模型在api調用後更新。 – gyc

+0

這裏你去:https://jsfiddle.net/xgcphw0m/4/使用地理位置。如果你已經使用了像$ q或$ http這樣的角度服務,它將起作用,但這是因爲它們用$ apply包裝了回調。這就是我想要避免的。 –

+0

不幸的是,我不太瞭解es6。 – gyc

回答

0

由於您正在調用第三方API,您將不得不讓角度更新並識別到達的新數據。如果你不想使用$ scope,你可以使用$ timeout來包裝你的代碼(這會觸發你的摘要循環)

function CompController(TPApi) { 
    let self = this; 
    this.endCallback = false; 
    TPApi.call(data,() => $timeout(() => this.endCallback = true, 0)); 
}