Как изменить элемент массива, переданного в качестве контекста данных в дочернем шаблоне?
У меня есть локальная коллекция, в которой хранятся массивы шансов:
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 ...}}, например, чтобы просмотреть циклы oddsAverages. Это дочерний шаблон:
<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>
Проще говоря, мой вопрос в том, что нужно изменить и что написать после строк ниже, чтобы позволить дочернему шаблону обновлять контекст данных (поэтому вызовите update и измените значения из массивов ChecksCollection):
Template.InputOdds.events({
'keyup input.form-control': function (event, template) {
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});
Похоже, вы можете использовать метеорные методы: http://docs.meteor.com/
так что вы можете сделать это так:
сервер:
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);
}
)};