在工厂服务js文件中,我创建了一个这样的服务:
DashboardFactory.restService = function(method) {
var teststatus = "aaa";
switch (method) {
case "getAll":
$http.get($_REST_API_ROOT_URL + "clients").success(function(data) {
teststatus = data;
}).error(function(error) {
teststatus = 'Unable to load the client data: ' + error.message;
});
teststatus = "bbb";
break;
}
return teststatus;
};
在控制器中,代码如下:
$scope.AllClients=DashboardFactory.restService("getAll","","");
我还将“AllClients”放在html页面上以监控结果:
{{AllClients}}
我认为“AllClients”应该显示来自远程服务器的API数据。但实际上它总是给我“bbb”。
我该怎么办?
提前致谢!
答案 0 :(得分:0)
teststatus
设置为“bbb”,并在API调用完成之前返回,因为调用是异步的。
有关从API调用中返回数据的不同方法,请参阅AngularJS $http call in a Service, return resolved data, not promises。
您要做的是在 teststatus
/ .success()
函数的末尾而不是在外面返回.error()
。这样,它只在完成API调用后返回,并将其设置为调用返回的数据。
答案 1 :(得分:0)
方法1:您根本不需要退货。您可以将模型发送到服务RestService.getAllClients = function(myModel)
,在成功myModel.AllClients = data;
上设置模型上的属性,然后使用{{myModel.AllClients}}
显示该属性。直接在传入的模型中设置属性将自动更新绑定。
示例:http://jsbin.com/muxijozofa/edit?html,js,output
方法2:否则您需要返回整个get
调用,这将返回promise
,然后您需要在控制器上解析根据fe How do I return data from a $http.get() inside a factory in angularjs
重构提示:您可以构建一个通用的休息服务工厂,然后为每种类型的呼叫实施,而不是构建一个充满了switch-case:s的“全能”休息服务。因此,每种类型的休息呼叫都会获得一种方法。而不是DashboardFactory.restService
,您将调用RestService.getAllClients
,它根据上述方法设置数据或返回承诺。
Switch-case对功能选择不利,你隐藏了功能并使代码容易出现隐藏错误。