我认为你的问题是它getLastMessage
是一个函数,而不是一个属性,所以你的代码相当于{{ function(){} }}
它甚至永远不会被调用。您需要像调用控制器一样实际调用该函数{{getLastMessage()}}
或立即调用控制器上的函数。
如果我可以为您提供一个稍微简单的解决方案(尽管效率可能较低):
如果您尚未将集合绑定到范围变量,则可能需要执行以下操作:
// SERVER CODE -- put in your /server directory
// NB: I am only publishing the specific user's (uid) chats in case someone
// finds this through Google and by accident creates a vulnerability
// unintentionally. Feel free to change the Mongo query if you want to
// publish all chats to all users
Meteor.publish("Chats", function () {
return Chats.find({uid:this.userId}, {fields: {'_id': 1,'content': 1,'uid': 1}});
});
// CLIENT CODE
$scope.chatsCollection = $scope.$meteorCollection("Chats").subscribe("Chats");
// lastMessage should be updated reacitvely -- no need to run a function
$scope.lastMessage = $scope.chatsCollection.slice(-1)[0];
话虽如此,切片假设 Meteor Collection 按时间顺序将新文档附加到末尾,因此现实可能并不那么简单。$scope.chatsCollection 包含数组的所有方法,因此您可以对其进行排序或使用 underscore.js 之类的东西对其执行查询。
您可能考虑采用的另一种方法是使用纯 MeteorCursor.observe
方法- 看起来您在最初的方法中有点遵循。这里的一个好处是您可以对 Mongo 查询执行任何必要的排序操作,这可能会更有效。
我认为这看起来像:
// CLIENT SIDE CODE
// Initial assignment
$scope.lastMessage = Chats.find({uid:Meteor.userId(), {
fields: {
'_id': 1,
'content': 1,
'uid': 1
},
sort: {INSERT YOUR SORT HERE, e.g. by creation time}
})
.fetch().slice(-1).pop();
// Subscription to changes made on the query
Chats.find({uid:Meteor.userId(), {
fields: {
'_id': 1,
'content': 1,
'uid': 1
},
sort: {INSERT YOUR SORT HERE, e.g. by creation time}
})
.observe({added: function(document){$scope.lastMessage = document}});