あなたの問題は、それ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
メソッドを使用することです。ここでの利点の 1 つは、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}});