2015-01-10 8 views
0

У меня есть game шаблона, который включен в таблице, как это:Противоречивый экземпляр шаблона - Meteor

<table class="games-table"> 
    {{#each publisher}} 
    <tr id="{{_id}}" class="publisher-row"> 
     <td class="publisher"> 
     {{> publisherTemplate}} 
     </td> 
     <td class="shooter"> 
     {{#each gamesType '1'}} 
     {{> game}} 
     {{/each}} 
     </td> 
     <td class="adventure"> 
     {{#each gamesType '2'}} 
     {{> game}} 
     {{/each}} 
     </td> 
    </tr> 
    {{/each}} 
</table> 

Помощник gamesType просто возвращает соответствующую игру (status атрибута в документе, как «1» и «2 «).

Теперь целью является перемещение игр между полями данных таблицы. Когда есть только одна игра, связанная с gameType (и в td) все работает нормально. Но когда их несколько, экземпляр шаблона кажется непоследовательным.

Вот мои шаблонные функции обратного вызова:

Template.game.created = function() { 
    console.log("created: " + this.data._id); 
}; 

Template.game.destroyed = function() { 
    console.log("destroyed: " + this.data._id); 
}; 

Template.game.rendered = function() { 
    console.log("rendered: " + this.data._id); 
}; 

На первый рендеринг выход консоли, как это (для двух игр с одинаковым gameType ("2")):

created: HN7FL8wKtfxDLzrJM 
rendered: HN7FL8wKtfxDLzrJM 
created: g2EGnaGW9SP6yhbT7 
rendered: g2EGnaGW9SP6yhbT7 

Это совершенно хорошо. Теперь я обновить status на «1» и вывод на консоль, как это (что тоже абсолютно нормально):

created: HN7FL8wKtfxDLzrJM 
destroyed: HN7FL8wKtfxDLzrJM 
rendered: HN7FL8wKtfxDLzrJM 

Но теперь, когда я обновляю status обратно в «2» игра снова в правильном колонка, но посмотрите на выходе консоли:

destroyed: HN7FL8wKtfxDLzrJM 
created: HN7FL8wKtfxDLzrJM 
rendered: g2EGnaGW9SP6yhbT7 

Я не знаю, почему это происходит, и я очень расстроен, потому что мне нужно правильно _id для моей логики в rendered обратного вызова. Я попробовал этот обходной путь:

Template.game.created = function() { 
    console.log("created: " + this.data._id); 
    this.currGame = this.data; 
}; 

..., а затем получить доступ к нему в rendered обратного вызова с this.currGame вместо this.data. Проблема с этим подходом заключается в том, что это не работает для другой игры в том же столбце (потому что this.currGame находится в состоянии устаревания).

Любая помощь была бы принята с благодарностью!

EDIT: Вот gameType помощник:

gameType: function(type) { 
    return Games.find({publisherId: this._id, status: type}); 
} 

и вот как я обновляю status:

Games.update({_id: "HN7FL8wKtfxDLzrJM"}, {$set: {status: "2"}}); 
+1

мутноватый, что 'gameStatus'and как вы обновляли его? что такое помощник для 'gameType'? – ajduke

+0

Привет, я обновил сообщение и добавил то, что вы упомянули. – user3475602

ответ

0

Хорошо, я "решить" мой вопрос, хотя я дон Не понимаю, почему экземпляры шаблонов от created и rendered отличаются друг от друга, вот мое обходное решение:

  1. Добавлен новый атрибут Games коллекции под названием lastUpdated
  2. Добавлен пакет Meteor Collection Hooks: meteor add matb33:collection-hooks
  3. Добавлена ​​коллекция крюк (1).
  4. Обновлено gameType helper (2).

(1):

Games.before.update(function (userId, doc, fieldNames, modifier, options) { 
     modifier.$set = modifier.$set || {}; 
     modifier.$set.lastUpdated = new Date(); 
}); 

(2):

gameType: function(type) { 
    return Games.find({publisherId: this._id, status: type}, {sort: {lastUpdated: -1}}); 
} 
Смежные вопросы