2015-07-08 2 views
0

Я использую angular-meteor Я удалил пакет autopublish. Я не могу понять, почему первый запрос возвращает undefined, и почему он запускает еще два запроса для всего трех.Почему запрос выполняется 3 раза, и как я могу обеспечить, чтобы запрос выполнялся один раз, и результаты гарантировали, что данные не будут определены ранее?

В принципе, я хочу запустить запрос один раз и вернуть его данные, а затем заполнить страницу результатами. Как я могу это сделать?

В моей 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 публикации на стороне сервера. Я хочу, чтобы вернуть курсор, который просто содержит объект проекта на основе идентификатора передается из $stateParams:

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

Клиентский журнал консоль показывает, что запрос побежал три раза. Первый не определен, второй находит проект, а третий находит тот же проект:

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 
+0

Интересно, если это происходит потому, что тот же контроллер ProjectDetailsCtrl вызывается в каждом из видов: –

ответ

0

I удален ключ контроллера из 'projectDetail' состояния:

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

и избавляется от неопределенного, и это было получать отдачу нг не определено, так как нет /:projectId ...

прогонов дважды, потому что controller: 'ProjectDetailsCtrl' объявлен в views