2016-07-27 68 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 }}将根据回复进行更新。

该模式仅限于对象(和数组),标量值应该用对象包装。