0

我正在使用angular-meteor我已经删除了autopublish包。我无法弄清楚为什么第一个查询返回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在服务器端的出版物中。我想根据传入的 id 返回一个仅包含项目对象的游标$stateParams

Meteor.publish("project", function(projectId){
    console.log("projectId: ", projectId);
    return Projects.find({ _id: projectId });
});

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

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);
            });
}]);

客户端控制台日志显示查询运行了 3 次。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 也显示了运行 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
4

1 回答 1

0

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

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

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

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

于 2015-07-09T00:25:42.740 回答