Как изменить элемент массива, переданный в качестве контекста данных в дочернем шаблоне?

У меня есть локальная коллекция, в которой хранятся массивы шансов:

ChecksCollection = new Mongo.Collection(null);
ChecksCollection.insert({
  odds: ['', ''],
  oddsAverages: ['', ''],
  oddsCompeting: ['', '']
});

И помощник, который устанавливает родительский контекст данных:

Template.Step1.helpers({
  bet: () => ChecksCollection.findOne()
});

И теперь мне нужен дочерний шаблон, который может изменять любой индекс любого массива из ChecksCollection. На данный момент я называю это так:

{{>InputOdds odds=bet.odds.[0] label='The odds that are being offered to you:' placeholder='Any odds style works! Equivalent examples: 1/4   1.25   -400'}}

{{>InputOdds odds=bet.odds.[1] label='The odds offered for the opposite outcome:' placeholder=''}}

Позже я мог бы вызвать его с помощью {{#each ... in ...}}, например, для циклического перебора коэффициентов. Это дочерний шаблон:

<template name="InputOdds">
  <div class="form-group">
    <label for="odds">{{label}}</label>
    <input type="text" class="form-control" id="odds" value="{{odds}}"
             placeholder="{{placeholder}}">
  </div>
</template>

Проще говоря, мой вопрос заключается в том, что изменить и что написать после строк ниже, чтобы разрешить дочернему шаблону обновлять контекст данных (поэтому вызовите обновление и изменение значений из массивов ChecksCollection):

Template.InputOdds.events({
  'keyup input.form-control': function (event, template) {

person Laurentiu Andronache    schedule 27.01.2016    source источник


Ответы (2)


Я решил это да! Если кто-то находится в такой же ситуации, используйте следующий код:

var objectForSet = {};
objectForSet[key + '.' + index] = value;
//todo remove debugging code from below. The line which creates the rendering problem is: ChecksCollection.update({}, {$set: objectForSet});
console.log(`Modifying local collection at key: ${key}; array index: ${index};`);
ChecksCollection.update({}, {$set: objectForSet});
person Laurentiu Andronache    schedule 29.01.2016

Похоже, вы можете использовать методы метеора: http://docs.meteor.com/#/full/meteor_methods

поэтому вы можете сделать это следующим образом:

сервер:

Meteor.methods({
  foo: function (arg1, arg2, arg2) {
   ChecksCollection.insert({
    odds: ['', ''],
    oddsAverages: ['', ''],
    oddsCompeting: ['', '']
  });
 }
)};

а затем вызовите метод:

Template.InputOdds.events({
  'keyup input.form-control': function (event, template) {
       //set up your data from the form
      Meteor.call('foo', data1, data2, data3);
      }
    )};
person Villemh    schedule 27.01.2016
comment
Это не ответ. Во-первых, это локальная коллекция, нет смысла использовать Methods. - person Laurentiu Andronache; 27.01.2016