为什么查询运行 3 次,如何确保查询运行一次并且结果确保数据不是未定义的?

Why is the query running 3 times, and how can I ensure that the query runs once and the results ensure the data is not undefined at first?

我正在使用 angular-meteor 我已经删除了 autopublish 包。我不明白为什么第一个查询是 returning undefined,为什么它 运行 又是两个查询,总共三个。

基本上,我想 运行 一次查询,让它的数据成功返回,然后用结果填充页面。我怎样才能做到这一点?

在我的 routes.js 文件中使用 angular-ui-router:

angular.module('projectApp').config(['$urlRouterProvider', '$stateProvider', '$locationProvider', 
    function($urlRouterProvider, $stateProvider, $locationProvider){

        $locationProvider.html5Mode(true);

        $stateProvider
            .state('projectDetail', {
                abstract: true,
                url: '/experience/projects',
                templateUrl: 'client/projects/views/project-layout.ng.html',
                controller: 'ProjectDetailsCtrl'
            })
            .state('projectDetail.cards', {
                url: '/:projectId',
                views: {
                    'cards': {
                        templateUrl: 'client/projects/views/partials/project-cards.ng.html',
                        controller: 'ProjectDetailsCtrl'
                    },
                    'toolbar': {
                        templateUrl: 'client/projects/views/partials/project-toolbar.ng.html',
                        controller: 'ProjectDetailsCtrl'
                    }
                }
            });
    }]);

在我的 projects.js 服务器端发布中。我想 return 一个游标,它只包含基于从 $stateParams:

传入的 id 的项目对象
Meteor.publish("project", function(projectId){
    console.log("projectId: ", projectId);
    return Projects.find({ _id: projectId });
});

在我的客户端 projectsDetail 控制器中。我正在关注 subscribe 示例:

angular
    .module('projectApp')
    .controller("ProjectDetailsCtrl", ['$scope', '$stateParams', '$meteor', 
        function($scope, $stateParams, $meteor){ 
           // subscribing to publication here 
            $scope.$meteorSubscribe('project', $stateParams.projectId).then(function(subscriptionHandle){
                $scope.project = $scope.$meteorObject(Projects, $stateParams.projectId);
                console.log("scope project is ready: ", $scope.project);
            });
}]);

客户端控制台日志显示查询运行三次。 1st未定义,2nd找项目,3rd找同一个项目:

scope project is ready:  
SubObject {$$collection: C…s._…n.ns.Collection, $$options: undefined, $$id: undefined, $$internalProps: Array[15], autorunComputation: T…r.Computation} projectDetails.js?b1b67b05e090e366d0853cb2a75b34cc7f75a5d0:10 

scope project is ready:  
SubObject {_id: "zQ8Y938F6HKKqjSdA", image: "/images/large-img-placeholder.jpg", title: "project 1", description: "<p>project 1 description</p>", projectRole: Array[4]…}
    projectDetails.js?b1b67b05e090e366d0853cb2a75b34cc7f75a5d0:10 

scope project is ready:  
SubObject {_id: "zQ8Y938F6HKKqjSdA", image: "/images/large-img-placeholder.jpg", title: "project 1", description: "<p>project 1 description</p>", projectRole: Array[4]…}

服务器端console.log也显示查询运行ning 3次:

I20150708-14:36:10.967(-4)? projectId:  null
I20150708-14:36:10.976(-4)? projectId:  zQ8Y938F6HKKqjSdA
I20150708-14:36:10.980(-4)? projectId:  zQ8Y938F6HKKqjSdA

我从 'projectDetail' 状态中删除了控制器密钥:

.state('projectDetail', {
                abstract: true,
                url: '/experience/projects',
                templateUrl: 'client/projects/views/project-layout.ng.html',
                // controller: 'ProjectDetailsCtrl' <- remove
                })

这摆脱了未定义,它返回未定义,因为没有 /:projectId ...

运行两次,因为 controller: 'ProjectDetailsCtrl'views

中声明