Angularjs初始化服务
我正在从事AngularJs项目,该项目使用服务调用从服务器加载顶级导航项Angularjs初始化服务,angularjs,Angularjs,我正在从事AngularJs项目,该项目使用服务调用从服务器加载顶级导航项 App.service('Menu', function($http){ return { get:function(callback){ $http.get('api/menu.json').success(function(menuData){ callback(menuData); }); } } })
App.service('Menu', function($http){
return {
get:function(callback){
$http.get('api/menu.json').success(function(menuData){
callback(menuData);
});
}
}
});
我在我的BaseController
中使用了相同的方法,如下所述
App.controller('BaseCtrl', function($scope, Menu){
$scope.menuData = {};
Menu.get(function(menuData){
$scope.menuData = menuData;
});
});
在服务调用成功并将值分配给$scope之前,“我的菜单”会显示一段时间为空。menuData在呈现视图之前是否有任何方法获取相同的值
请让我知道,我可能已经尝试了所有可能的方法来做到这一点,但没有任何效果:(
PS:我正在使用AngularJS v1.2.9在渲染视图之前确保数据可用的最佳方法是使用路线上的属性
如果它返回一个承诺,它将在实际呈现视图之前解析该承诺
.when('/blah', {
templateUrl: '/path/to/view.html',
controller: 'myController',
resolve: {
menuItems: function($http){
return $http.get('api/menu.json');
}
}
});
该值将作为依赖项传递给控制器:
angular.controller('myController', function(menuItems){
$scope.menuData = menuItems;
});
从您的服务中返回承诺,并在控制器的解决方案中使用该承诺:
app.service('Menu', function($http) {
var menuData = null;
var promise = $http.get('api/menu.json').success(function (data) {
menuData = data;
});
return{
getMenuPromise: promise,
getMenuData:function(){
return menuData;
}
};
});
在路线定义中:
$routeProvider
.when('/home',{controller:'BaseCtrl',
templateUrl:'../homeTpl.html',
resolve:{
'menuData':function(Menu){
return Menu.getMenuPromise;
}
}})
现在,当实例化BaseCtrl
时,数据就在那里:
app.controller('BaseCtrl', function($scope,Menu) {
$scope.menuData = MyService.getMenuData();
});
请看一下ng斗篷
@MohammadSepahv,我已经阅读了ng斗篷的文档,但不了解它是如何工作的,以及我的视图中有哪些部分需要应用相同的内容,请您解释一下。感谢ng斗篷
在绑定实际完成之前,基本上不会在视图中显示绑定表达式et,我一开始以为这是你的问题,从某种程度上说,这是一种比阻止渲染控制器/视图更好的方法,因为后者在某种程度上扼杀了水疗中心的点,水疗中心具有几乎即时的路线转换和非常流畅的性质。我在菜单中对我的答案进行了一个小的编辑,在服务getMenuPromise
shoull中d直接指向服务中的承诺,它不应该是一个返回承诺的函数。问题是my BaseCtrl未分配给任何特定视图,它是所有视图的公共控制器。请建议一种方法来解析控制器中而不是路由器中的数据。感谢问题是my BaseCtrl未分配给任何特定视图,它是一个common控制器用于所有视图。请建议一种解决控制器中数据而不是路由器中数据的方法。Thanks@AshokVishwakarma-你无法通过这种方式完成你想要的。你可以创建一个承诺来解决你控制范围内的问题,然后调用init()
或类似的东西,但是您不能阻止视图在不使用路由的情况下加载。在控制器内部,您可以做的最好的事情是创建某种就绪
标志,当所有内容都加载时,该标志会被翻转,并且在就绪时只需ng隐藏
或ng显示
您的内容。