【问题标题】:Using resolve in meanjs在meanjs中使用resolve
【发布时间】:2015-05-05 20:49:45
【问题描述】:

我已经看到了如何在激活控制器之前使用“resolve”加载数据的各种示例(例如https://github.com/angular-ui/ui-router/wiki),但我不明白如何将其合并到 MeanJS 架构中。

这是一个热门问题/答案:Delaying AngularJS route change until model loaded to prevent flicker

我不确定是否应该在 mymodule.client.routes.js 中添加“resolve”选项和/或如何将预加载的服务构造/注入到控制器参数中。

关于如何转换示例以适应 MeanJS 的任何建议?

使用 Angular 版本 1.2.26

-- 更新--

我尝试从视图中删除 data-ng-controller="MyController" ,而是直接在 mymodule.client.routes.js 中的“resolve”选项旁边设置控制器。这似乎修复了将解析的对象注入控制器,但改变了 MeanJS 架构。这是正确/唯一的方法吗?

【问题讨论】:

    标签: meanjs


    【解决方案1】:

    我发现(基于另一个 stackoverflow 答案)是这样设置的:

    查看:

    <section data-ng-controller="ArticlesController">
      <!-- accessing article variable resolved in routes stateProvider -->
    </section>
    

    控制器:

    'use strict';
    
    angular.module('articles').controller('ArticlesController', ['$scope',
        function($scope) {
            /*
             * Whatever methods/variables/binds etc. you need.
             * Also you can access $scope.article because it is already resolved 
             */
        }
    ]);
    

    路线(这就是重点):

    $stateProvider.
        state('article', {
            url: '/v/:path',
            templateUrl: 'modules/articles/views/article.client.view.html',
            resolve: {
                article: function($stateParams, Articles) {
                    return Article.get({
                        path: $stateParams.path
                    }).$promise;
                }
            },
            controller: function($scope, article) {
                $scope.article = article;
            }
        }).
    

    所以你解析article 对象,通过stateProvider controller 将它保存在$scope 中,然后你可以在视图和ArticlesController 中使用它,因为它们共享相同的范围。

    希望它会有所帮助。 (我也希望这离当前 MEANjs 进化状态中的最佳解决方案不远)

    【讨论】:

      【解决方案2】:

      不要在视图内指定控制器。相反,根据https://github.com/angular-ui/ui-router/wiki

      定义路由时分配控制器

      例如/public/modules/articles/config/articles.client.routes.js:

      angular.module('articles').config(['$stateProvider',
          function($stateProvider) {
              // Articles state routing
              $stateProvider.
              state('listArticles', {
                  url: '/articles',
                  templateUrl: 'modules/articles/views/list-articles.client.view.html',
                  controller: 'ArticlesController',
                  resolve: {
                      UnitTypes:  function($http){
                          return $http({method: 'GET', url: '/unit-types'});
                      },
                  },
              }
          }
      ]);
      

      【讨论】:

        【解决方案3】:

        今天早上我只是在这个问题上遇到了麻烦。

        核心路由配置(core.client.routes.js)

        这是我的主要路线的核心配置功能:

        $stateProvider.state('home', {
                        url: '/',
                        templateUrl: 'templates/main.client.view.html',
                        controller:'MainCtrl',
                        resolve: {
                initialData: function(mainControllerInitialData) {
                    return mainControllerInitialData();
                }
            }
                });
        

        *注意:确保您的服务以驼峰命名,而不是 PascalCase;否则你的 taskrunner 中的默认任务(我正在使用 gulp)将变得不稳定

        在 resolve 方法中作为承诺返回的服务 (mainControllerInitialData.service.js)

        这是服务本身:

         'use strict';
            var ser = angular.module('mean')
            .factory('mainControllerInitialData', function(queryPrismicDocument, $q) {
                return function() {
        
        
                     var qpd = queryPrismicDocument;
        
                     var restaurantMenu = qpd.query('[[:d = at(document.type, "restaurantMenu")]]', 'restaurantMenu');
        
                     console.log('i am MainControllerInitialData.service.js');
        
        
        
        
                    return $q.all([restaurantMenu]).then(function(results){
                        return {
                            restaurantMenu: results[0]
                        };
                    });
                };
            });
        

        主控制器(main.controller.js)

        这是路由配置(“MainCtrl”)中列出的控制器,我通过 resolve 方法将值注入其中

        'use strict';
        
        angular.module('core')
          .controller('MainCtrl', ['$scope','initialData',function ($scope,  initialData) {
            console.log('i am MainCtrl...');
        
            console.log('i am at the top of the pack');
            console.log('i am initialData:');
            console.log(initialData);
        
            $scope.restaurantMenu = initialData.restaurantMenu[0];
        
        
        
        
          }]);
        

        【讨论】:

          猜你喜欢
          • 2015-03-03
          • 2016-10-10
          • 2014-10-23
          • 2016-02-01
          • 2015-02-23
          • 2016-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多