怎么可能在我的控制器中访问帖子?

时间:2016-05-04 18:59:24

标签: angularjs

我怎么可能$scope.post = post;而且我不必做$scope.post = posts.post;

app.js

angular.module('flapperNews', ['templates','ui.router'])
.config([
'$stateProvider',
'$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {

  $stateProvider
    .state('home', {
      url: '/home',
      templateUrl: 'home/_home.html',
      controller: 'MainCtrl',
      resolve: {
        postPromise: ['posts', function(posts){
          return posts.getAll();
        }]
      }
    })
   .state('posts', {
      url: '/posts/{id}',
      templateUrl: 'posts/_posts.html',
      controller: 'PostsCtrl',
      resolve: {
        post: ['$stateParams', 'posts', function($stateParams, posts) {
          return posts.get($stateParams.id);
        }]
      }
    });

  $urlRouterProvider.otherwise('home');
}])

postCtrl.js

angular.module('flapperNews')
.controller('PostsCtrl', [
    '$scope',
    'posts',
    'post',
    function($scope, posts, post){
        $scope.post = post;
        $scope.addComment = function(){
          if($scope.body === '') { return; }
          $scope.post.comments.push({
            body: $scope.body,
            author: 'user',
            upvotes: 0
          });
          $scope.body = '';
        };
}]);

1 个答案:

答案 0 :(得分:0)

这很简单。

您在声明posts州的声明中写道:

resolve: {
    post: ['$stateParams', 'posts', function($stateParams, posts) {
        return posts.get($stateParams.id);
    }]
}

您在此功能中注入了posts服务并拨打电话(对某些API,无论如何)。该函数返回promise。状态声明中的属性resolve最初将等待解决已写入的所有承诺。之后,它会将所有已解决的承诺的结果注入控制器。

让我们来看看你的控制器:

angular.module('flapperNews')
       .controller('PostsCtrl', [
           '$scope',
           'posts',
           'post',
           function($scope, posts, post){
               $scope.post = post;
               ...
           };
}]);

在注射部分,我们可以看到posts - 注射服务。同样post - 这将是一个解决的承诺,来自你所在州的解决部分。

这意味着您不必再次调用posts服务,因为在实例化控制器之前已经调用了它。您可能根本不需要注入此服务。

我希望我澄清了这一点,它会帮助你理解。