我正在开发一个Angular app结构,它有一个后端服务可以与Rest API(例如使用Restangular)通信,第二个服务保存多个控制器的状态,最后是控制器。
状态保持服务应该能够展开从Restangular Service返回的promise并将数据提供给控制器。我希望控制器不知道如何接收数据,因为这是服务的责任。这就是控制器不应该打开承诺等的原因。
我的问题如下: 当我在状态保持服务中解包承诺并将其写入变量时,控制器永远不会获得正确的值。但是,当我将其写入JavaScript对象属性时,它最终会在解析promise时更新。任何人都可以向我解释为什么行为上有差异吗?
我的控制器:
function myModuleController($scope, myService) {
$scope.backendName1 = myService.getBackendName1();
$scope.backendName2 = myService.getBackendName2();
}
我的中介服务:
function myService(myBackendService) {
var backendName = '';
var backendObject = {
name:''
}
function getBackendName1() {
myBackendService.getBackendName().then(
function(value) {
backendName = value;
}
)
return backendName;
}
function getBackendName2() {
myBackendService.getBackendName().then(
function(value) {
backendObject.name = value;
}
)
return backendObject;
}
return {
backendName: backendName,
getBackendName1: getBackendName1,
getBackendName2: getBackendName2
}
}
Plunker:http://plnkr.co/edit/A31sscAqCCcmnmHfmSLR
问题是getBackendName1没有得到解决, 而getBackendName2正在解决。请参阅Plunker进行演示。
答案 0 :(得分:1)
你在这里遇到了竞争状况。你有2个选择。要么使用带有解析的ui-router,要将已解析的数据注入控制器,要么需要从服务返回promise并等待在控制器中解析的承诺
答案 1 :(得分:0)
您应该为范围变量指定myService.getBackendName1
引用,并使用插值指令在UI上调用它。
<强>控制器强>
function myModuleController($scope, myService) {
$scope.backendName1 = myService.getBackendName1;
$scope.backendName2 = myService.getBackendName2();
}
<强> HTML 强>
<body ng-app="myModule">
<div ng-controller="myModuleController">
<h1>Hello Plunker!</h1>
<br /> Doesnt Work backendName1: {{backendName1()}}
<br /> Works: {{backendName2.name}}
</div>
</body>