2016-06-15 2 views
0

Я использую ReactiveDict, чтобы изменить состояние и стиль одного или нескольких шаблонов. Я хотел бы сохранить id каждого выбранного шаблона в массив, который затем можно использовать в методе. Прежде чем я инициирую это событие, пользователь должен иметь возможность добавлять и удалять любые id из массива, пока не будет определено окончательное.Временное хранение массива в Метеор

Как создать массив со всеми id s, у которого template.instance().state установлено значение isSelectedId?

Я думал, что могу использовать array.push() для каждого щелчка и сохранять в переменной сеанса, но переменная Session не изменяется. У меня также нет способа удалить конкретный id, если он не выбран. Я также рассматривал сохранение в коллекции, но мне нужно только временное хранилище.

EDITED КОД ВКЛЮЧИТЬ ЧАСТЬ ОТВЕТА С ПОМОЩЬЮ Краеведение

<template name="App"> 
    <div id="app-inner"> 
     {{#each companies}} 
      {{>Company}} 
     {{/each}} 
    </div> 
</template> 

<template name="Company"> 
    <div class="company {{isSelected}}"> 
     <a>Company: {{companyName}}</a> 
    </div> 
</template> 

Template.App.helpers({ 
    companies: function() { 
     return Companies.find({}); 
    } 
}); 

Template.Company.events({ 
    'click .company': function(e) { 
     var state = Template.instance().state.get('isSelectedId'); 
     var id = this._id; 
     var count = localSelections.find().count(); 
     if(count === 0) { 
      var localId = localSelections.insert({}); 
     } 
     console.log("Local ID: ", localId); 
     switch (state) { 
      case null: 
       Template.instance().state.set('isSelectedId', this._id); 
       localSelections.update({_id:localId},{$push:{select:id}}); 
       break; 
      case id: 
       Template.instance().state.set('isSelectedId', null); 
       localSelections.update({_id:localId},{$pull:{select:id}}); 
       break; 
     } 
    } 
}); 

Template.Company.helpers({ 
    'isSelected': function() { 
     return this._id === Template.instance().state.get('isSelectedId') ? 'is-selected' : ''; 
    } 
}); 

Template.Company.onCreated(function() { 
    this.state = new ReactiveDict; 
    this.state.set('isSelectedId', null); 
}); 

//client/collections 
    localSelections = new Mongo.Collection(null); 

Meteor.methods({ 
    valuationAdd: function(array) { 
     check(array, Array); 
     Valuations.insert({selections:array}); 
    } 
}); 

ответ

0

Временное хранилище на стороне клиента легко создать в local (unmanaged) collection

myLocalCollection = новый Mongo.Collection (нуль);

Такая коллекция имеет все нормальные черты коллекции, за исключением:

  • Он никогда не синхронизируется с сервером
  • Вы можете обновить или удалить несколько документов одновременно с {multi: true}

Недавно я написал article on TheMeteorChef о том, как их использовать.

+0

Спасибо, Мишель, как всегда, это должно отлично работать. Я пересмотрел свой код выше, чтобы показать свой прогресс. Тем не менее, один вопрос - мне нужно сохранить идентификаторы в массиве в одном документе. Приведенный выше код создает документ и добавляет идентификатор для первого щелкнутого элемента ('console.log (localId)' правильно возвращает созданный идентификатор). Но он не может читать 'localId' для последующих кликов. Должен ли я или я могу создать этот документ где-то вне обработчика событий? – Bren

+0

Я * считаю, что вы пытаетесь отследить '' идентификаторы ваших документов 'Company'. Вы можете просто 'localSelections.insert ({_ id: this._id})' и создать совпадение 1: 1 с вашими документами 'Company'. –

+0

Спасибо, да, просто отслеживание '_id' 'документов компании. Я думал, что сохраню шаг, просто сохранив его в один локальный документ, но я могу использовать отдельные документы, а затем потом каждый раз вводить «id» в массив. Все отлично работает. – Bren

Смежные вопросы