Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs初始化服务_Angularjs - Fatal编程技术网

Angularjs初始化服务

Angularjs初始化服务,angularjs,Angularjs,我正在从事AngularJs项目,该项目使用服务调用从服务器加载顶级导航项 App.service('Menu', function($http){ return { get:function(callback){ $http.get('api/menu.json').success(function(menuData){ callback(menuData); }); } } })

我正在从事AngularJs项目,该项目使用服务调用从服务器加载顶级导航项

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显示
您的内容。