我有SPA。我有一些基本的初始化数据,我从服务器获取,我确定我要推迟每个页面加载,直到加载数据。 (此数据包含用户是否已登录,权限和其他重要内容)。因此,如果我有一个用于获取和访问该数据的服务,页面控制器可能会在我拥有数据之前开始执行,这很糟糕。
我也不能使用承诺,部分原因是它没有解决我的问题,我不希望页面开始加载,部分原因是它无法更新很容易,我不想总是使用承诺来获取这个基本数据
这是我迄今为止所尝试过的:
我的服务
SELECT UD.[Username], LD.[TransId], LD.Remarks
FROM dbo.UserDetails UD
INNER JOIN dbo.LeaveDetails LD
ON UD.PKField = LD.FKField <-- Change this to be your actual relationship
--Maybe ON UD.ClientUserID = LD.ClientUserID --Instead of above
WHERE LD.ClientUserId=@UID
AND LD.[TransId] = @TransId
我的页面控制器:
app.factory('AppData', function($q, $http){
var appData = {};
$http
.post( "/api/GeneralActions/getInitData", {
}).success(function (data, status, headers, config) {
appData = data;
}).error(function (data, status, headers, config) {
});
return {
getAppData: function () {
return appData;
}
};
});
答案 0 :(得分:1)
尝试以下代码段
app.factory('AppData', function($q, $http){
var appData = {};
$http
.post( "/api/GeneralActions/getInitData", {
}).success(function (data, status, headers, config) {
//appData = data;
angular.extend(appData, data);
}).error(function (data, status, headers, config) {
});
return {
getAppData: function () {
return appData;
}
};
});
而是再次创建appData对象,只需使用数据扩展它。通过这种方式,您的appData对象指针不会更改,控制器也将更新。
答案 1 :(得分:0)
您使用的是ngRoute
吗?如果是这样,听起来你想要的是在路由上有一个resolve属性,要求它们在更改新路径的路径之前加载一些东西。
请参阅the ngRoute docs并搜索resolve
。
答案 2 :(得分:0)
如果您正在使用库存Angular ngRoute
路由系统,则可以使用the resolve
property on the route指定承诺返回函数的映射。在这些承诺全部解决之前,路线控制器不会被初始化,作为奖励,承诺的结果将被注入路线控制器。
例如:
$routeProvider.when('/foo', {
controller: 'fooCtrl',
resolve: {
bar: function($http) { return $http.get('/load/the/bar'); }
}
});
// bar is injected from the route resolve
myApp.controller('fooCtrl', function($scope, bar) {
$scope.bar = bar;
});
答案 3 :(得分:0)
我认为应该是:
app.factory('AppData', function($q, $http){
var appData = {};
return {
getAppData: function () {
$http.post( "/api/GeneralActions/getInitData", {}).success(function (data, status, headers, config) {
return data;
}).error(function (data, status, headers, config) {
});
}
};
});