如何在 angular-meteor 上正确订阅
How to subscribe properly on angular-meteor
我是 angular-meteor 的新手,正在尝试制作一个类似于 Reddit 的应用程序进行练习。但我不确定订阅和发布的正确方法是什么。这是我的代码。
angular.module('app')
.config(($stateProvider) ->
$stateProvider
.state('boards-list',
url: '/board'
templateUrl: 'client/boards/boards-list.view.ng.html'
controller: 'BoardsListCtrl'
)
.state('board-detail',
url: '/board/:symbol'
templateUrl: 'client/boards/board-detail.view.ng.html'
controller: 'BoardDetailCtrl'
)
)
我想在 /board
上显示受欢迎的 post,如果你去特定的板,我想列出板中的所有 post。
这是板列表控制器
angular.module('app')
.controller('BoardsListCtrl', ($scope, $meteor, $modal, $log) ->
$meteor.subscribe('getPopularPosts')
$meteor.subscribe('getAllBoards')
$scope.boards = $scope.$meteorCollection(->
Boards.find({})
)
$scope.posts = $scope.$meteorCollection(->
Posts.find({}, _.defaults(DEFAULT_QUERY_OPTIONS, limit: 5))
)
$scope.getHref = (link) -> if link then "http://#{link}" else "#"
$scope.remove = (board) ->
$scope.boards.remove(board)
$scope.open = ->
modalInstance = $modal.open(
templateUrl: 'client/common/modal-new-board.view.ng.html'
controller: 'ModalNewBoardCtrl'
)
)
这是电路板细节控制器
angular.module('app')
.controller('BoardDetailCtrl', ($scope, $stateParams, $meteor, $modal) ->
boardSymbol = $stateParams.symbol
$scope.posts = []
$scope.$meteorSubscribe('getBoardBySymbol', boardSymbol)
$scope.board = $meteor.object(Boards, symbol: boardSymbol, false)
$scope.$meteorSubscribe('getPostsByBoard', boardSymbol)
$scope.posts = $scope.$meteorCollection(->
Posts.find(board: boardSymbol, DEFAULT_QUERY_OPTIONS)
)
$scope.open = ->
modalInstance = $modal.open(
templateUrl: 'client/common/modal-post.view.ng.html'
controller: 'ModalPostCtrl'
resolve:
symbol: -> $scope.board.symbol
)
)
我的问题是,如果我为 boardDetailCtrl 的 $scope.posts 写 Posts.find({}, DEFAULT_QUERY_OPTIONS)
,它实际上显示所有 post,就好像当状态为 /board
时变了。当你像 http://localhost:3000/angular
这样直接访问路由时,它会得到正确的 posts。不知道为什么会这样,但我将其更改为 Posts.find({board: boardSymbol}, DEFAULT_QUERY_OPTIONS)
然后它按预期工作。
考虑到我只订阅了getPostByBoard
,这意味着只能在给定的板上获得post,我应该只能获得其中的一些。我检查了控制台,就像 Posts.find({}).count()
一样,令人惊讶的是它有每个 post。
所以我的问题是,即使订阅了正确的发布功能,我是否应该添加查询以查找?还是我在某些时候错了?
无论何时在 Meteor 中开始订阅,您都会将订阅的 collection 添加到本地 collection。因此,如果您有一个公告板 collection,并且在您的主页中订阅以查看所有 collection,例如:
$meteor.subscribe('getAllBoards')
您正在将所有板添加到本地 collection。这个本地 collection 将一直存在,直到您明确停止订阅。因此,在您的董事会详细信息页面中,您仍然可以访问完整的 collection.
如果您注意到您正在使用 2 种不同的订阅方法。 $scope.$meteorSubscribe
和 $meteor.subscribe
。当 $scope 被销毁时,第一个将自动删除订阅。第二个会保留它。
因此,如果您想在进入看板详细信息页面时删除 collection 和 re-subscribe,您还需要在主页中使用 $scope.$meteorSubscribe
。
这里有一些值得深思的地方。如果您在主页上使用 $meteor.subscribe
,那么您已经在本地获得了这些帖子的信息,对吗?因此,当您单击 link 查看图板详细信息时,您实际上不需要再次订阅。您可以拨打:
$scope.board = $meteor.object(Boards, symbol: boardSymbol, false);
并且您将可以访问该版块的信息。 (我刚刚意识到你在谈论帖子而不是董事会,但想法仍然是一样的)。
简短回答:$meteor.subscribe()
不会自行取消订阅,您必须告诉它。 $scope.$meteorSubscribe
确实取消了订阅。
最佳做法?我会设置订阅选项,然后使用 find() 创建一个本地 collection,例如:
$scope.$meteorSubscribe('getPopularPosts', _.defaults(DEFAULT_QUERY_OPTIONS, limit: 5).then(-> {
$scope.posts = $scope.$meteorCollection(->
Posts.find();
)
})
然后在你的发布中添加选项:
Meteor.publish('getPopularPosts', function(options) {
return Posts.find({}, options);
});
这将限制发送给客户端的帖子数量,而不是发送所有帖子,并且只使用 5 个。
当您切换到看板详细信息视图时,它将不再有此信息来误导您,因为我们使用了 $scope.$meteorSubscribe
和 $scope.$meteorCollection
。
我是 angular-meteor 的新手,正在尝试制作一个类似于 Reddit 的应用程序进行练习。但我不确定订阅和发布的正确方法是什么。这是我的代码。
angular.module('app')
.config(($stateProvider) ->
$stateProvider
.state('boards-list',
url: '/board'
templateUrl: 'client/boards/boards-list.view.ng.html'
controller: 'BoardsListCtrl'
)
.state('board-detail',
url: '/board/:symbol'
templateUrl: 'client/boards/board-detail.view.ng.html'
controller: 'BoardDetailCtrl'
)
)
我想在 /board
上显示受欢迎的 post,如果你去特定的板,我想列出板中的所有 post。
这是板列表控制器
angular.module('app')
.controller('BoardsListCtrl', ($scope, $meteor, $modal, $log) ->
$meteor.subscribe('getPopularPosts')
$meteor.subscribe('getAllBoards')
$scope.boards = $scope.$meteorCollection(->
Boards.find({})
)
$scope.posts = $scope.$meteorCollection(->
Posts.find({}, _.defaults(DEFAULT_QUERY_OPTIONS, limit: 5))
)
$scope.getHref = (link) -> if link then "http://#{link}" else "#"
$scope.remove = (board) ->
$scope.boards.remove(board)
$scope.open = ->
modalInstance = $modal.open(
templateUrl: 'client/common/modal-new-board.view.ng.html'
controller: 'ModalNewBoardCtrl'
)
)
这是电路板细节控制器
angular.module('app')
.controller('BoardDetailCtrl', ($scope, $stateParams, $meteor, $modal) ->
boardSymbol = $stateParams.symbol
$scope.posts = []
$scope.$meteorSubscribe('getBoardBySymbol', boardSymbol)
$scope.board = $meteor.object(Boards, symbol: boardSymbol, false)
$scope.$meteorSubscribe('getPostsByBoard', boardSymbol)
$scope.posts = $scope.$meteorCollection(->
Posts.find(board: boardSymbol, DEFAULT_QUERY_OPTIONS)
)
$scope.open = ->
modalInstance = $modal.open(
templateUrl: 'client/common/modal-post.view.ng.html'
controller: 'ModalPostCtrl'
resolve:
symbol: -> $scope.board.symbol
)
)
我的问题是,如果我为 boardDetailCtrl 的 $scope.posts 写 Posts.find({}, DEFAULT_QUERY_OPTIONS)
,它实际上显示所有 post,就好像当状态为 /board
时变了。当你像 http://localhost:3000/angular
这样直接访问路由时,它会得到正确的 posts。不知道为什么会这样,但我将其更改为 Posts.find({board: boardSymbol}, DEFAULT_QUERY_OPTIONS)
然后它按预期工作。
考虑到我只订阅了getPostByBoard
,这意味着只能在给定的板上获得post,我应该只能获得其中的一些。我检查了控制台,就像 Posts.find({}).count()
一样,令人惊讶的是它有每个 post。
所以我的问题是,即使订阅了正确的发布功能,我是否应该添加查询以查找?还是我在某些时候错了?
无论何时在 Meteor 中开始订阅,您都会将订阅的 collection 添加到本地 collection。因此,如果您有一个公告板 collection,并且在您的主页中订阅以查看所有 collection,例如:
$meteor.subscribe('getAllBoards')
您正在将所有板添加到本地 collection。这个本地 collection 将一直存在,直到您明确停止订阅。因此,在您的董事会详细信息页面中,您仍然可以访问完整的 collection.
如果您注意到您正在使用 2 种不同的订阅方法。 $scope.$meteorSubscribe
和 $meteor.subscribe
。当 $scope 被销毁时,第一个将自动删除订阅。第二个会保留它。
因此,如果您想在进入看板详细信息页面时删除 collection 和 re-subscribe,您还需要在主页中使用 $scope.$meteorSubscribe
。
这里有一些值得深思的地方。如果您在主页上使用 $meteor.subscribe
,那么您已经在本地获得了这些帖子的信息,对吗?因此,当您单击 link 查看图板详细信息时,您实际上不需要再次订阅。您可以拨打:
$scope.board = $meteor.object(Boards, symbol: boardSymbol, false);
并且您将可以访问该版块的信息。 (我刚刚意识到你在谈论帖子而不是董事会,但想法仍然是一样的)。
简短回答:$meteor.subscribe()
不会自行取消订阅,您必须告诉它。 $scope.$meteorSubscribe
确实取消了订阅。
最佳做法?我会设置订阅选项,然后使用 find() 创建一个本地 collection,例如:
$scope.$meteorSubscribe('getPopularPosts', _.defaults(DEFAULT_QUERY_OPTIONS, limit: 5).then(-> {
$scope.posts = $scope.$meteorCollection(->
Posts.find();
)
})
然后在你的发布中添加选项:
Meteor.publish('getPopularPosts', function(options) {
return Posts.find({}, options);
});
这将限制发送给客户端的帖子数量,而不是发送所有帖子,并且只使用 5 个。
当您切换到看板详细信息视图时,它将不再有此信息来误导您,因为我们使用了 $scope.$meteorSubscribe
和 $scope.$meteorCollection
。