为什么查询运行 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
中声明
我正在使用 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
:
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