0

コントローラーの1つに次のメソッドがあります。を使用して HTML コードからこのメソッドを呼び出すと{{ getLastMessage }}、ブラウザがクラッシュします。このメソッドへの呼び出しが複数あり、ブラウザーが応答しません。誰かがこの問題を解決するのを手伝ってくれませんか?

$scope.getLastMessage = function(userId) {
   var query = {};
   query['uid'] = userId;
   var lastMessage = $meteor.collection(function(){
      return Chats.find(query, {fields: {'_id':1, 'content':1, 'uid':1}});
   });
   console.log(lastMessage);
   return lastMessage;
};
4

1 に答える 1

1

あなたの問題は、それ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}});
于 2015-09-03T21:41:36.347 に答える