2016-07-27 78 views
0

我在我的角度1.5控制器中有一個方法,如下所示,但我想重構ajax調用到工廠本身,但我遇到了承諾的問題..我是試圖達到在我的控制器中的一個點,我可以像下面顯示的那樣調用方法。這可能嗎?我試圖避免在控制器代碼...成功(函數(...)。如何從ajax承諾中返回一個值

任何幫助非常讚賞。

試圖移動到

vm.member = someFactory.getMember(vm.id); 

現有的工作的控制器代碼

vm.myMethod = myMethod; 
... 

function myMethod() { 
    someFactory.getMember(vm.id).success(function(response) { 
     vm.member = response; 
    }); 
} 

當我移動實現getMethod線進廠響應顯然是填充的,但只要我回到控制器,即使工廠的返回值是響應,結果也是未定義的。我知道這是因爲承諾,但有沒有我缺少的設計模式或乾淨的做法。使用我目前的方法,我的控制器散佈着.success(函數()...)

非常感謝!

回答

0

該過程被稱爲promise解包。

除了這個事實,success已經過時,應then更換,

someFactory.getMember(vm.id).then(function(response) { 
    var data = res.data; 
    ... 
}); 

這是完全確定有這樣的控制器。

這種模式的另一種方法是,返回自填充對象(一些ngResource $resource一樣):

function getMember(...) { 
    var data = {}; 
    $http(...).then(function (response) { 
    // considering that response data is JSON object, 
    // it can replace existing data object 
    angular.copy(data, response.data); 
    }); 
    return data; 
} 

在這種情況下控制器可到達的對象的引用即刻,和對象屬性的綁定{{ vm.member.someProperty }}將根據回覆進行更新。

該模式僅限於對象(和數組),標量值應該用對象包裝。