Шаблон Blaze, перебор полей?

#javascript #mongodb #meteor #meteor-blaze

#javascript #mongodb #метеор #meteor-blaze

Вопрос:

Мне не удалось найти ссылку на какой-либо ярлык, который может быть доступен для перебора полей с именами «week01», «week02», «week03», где я мог бы ссылаться на поле, которое является объектом, содержащим дочерние поля в той же структуре.

Я знаю #each для каждого документа, но не знаю, как работать с каждым полем. У меня есть поля на 30 недель, и я хотел бы перебирать поля, а затем ссылаться на свойства объекта.

Может кто-нибудь дать мне подсказку или онлайн-ресурс, который мог бы мне помочь? Я разработчик VB / php, разрабатываю свое первое приложение Meteor и впервые работаю с Mongo. Надеюсь, я упускаю что-то возможное.

     "personId": "rY7XaJJkrdAWaByQK",
    "week01": {
        "date": {
            "$date": "2021-04-07T12:00:00.000Z"
        },
        "field1": "chunks as necessary",
        "field2": "readable English",
        "field3": "Contrary to popular belief"
    },
    "week02": {
        "date": {
            "$date": "2021-04-14T12:00:00.000Z"
        },
        "field1": "consectetur, from",
        "field2": "more recently with desktop",
        "field3": "Contrary to popular belief"
    },
    "week03": {
        "date": {
            "$date": "2021-04-21T12:00:00.000Z"
        },
        "field1": "going through",
        "field2": "readable English",
        "field3": "Contrary to popular belief"
    },
    "week04": {
        "date": {
            "$date": "2021-04-28T12:00:00.000Z"
        },
        "field1": "words which don't look",
        "field2": "sure there isn't",
        "field3": "Contrary to popular belief"
    },
    "week05": {
        "date": {
            "$date": "2021-05-05T12:00:00.000Z"
        },
        "field1": "only five centuries",
        "field2": "Where can I get some",
        "field3": "infancy. Various"
    }
} ```
 

Ответ №1:

#each использует только массивы или курсоры, поэтому вам нужно извлечь массив из вашего объекта.

В JavaScript вы можете сгенерировать массив из полей (свойств) объекта (который является вашим документом) и отфильтровать их, чтобы они содержали только те, которые содержатся week в их имени свойства (key). Затем вы можете вернуть их через помощник:

 const document = {
   "personId": "rY7XaJJkrdAWaByQK",
    "week01": {
        "date": {
            "$date": "2021-04-07T12:00:00.000Z"
        },
        "field1": "chunks as necessary",
        "field2": "readable English",
        "field3": "Contrary to popular belief"
    },
    "week02": {
        "date": {
            "$date": "2021-04-14T12:00:00.000Z"
        },
        "field1": "consectetur, from",
        "field2": "more recently with desktop",
        "field3": "Contrary to popular belief"
    },
    "week03": {
        "date": {
            "$date": "2021-04-21T12:00:00.000Z"
        },
        "field1": "going through",
        "field2": "readable English",
        "field3": "Contrary to popular belief"
    },
    "week04": {
        "date": {
            "$date": "2021-04-28T12:00:00.000Z"
        },
        "field1": "words which don't look",
        "field2": "sure there isn't",
        "field3": "Contrary to popular belief"
    },
    "week05": {
        "date": {
            "$date": "2021-05-05T12:00:00.000Z"
        },
        "field1": "only five centuries",
        "field2": "Where can I get some",
        "field3": "infancy. Various"
    }
}

const weeks = Object.entries(document) // will be an array of key/value pairs
  .filter(([key, value]) => key.includes('week')) // only use week fields
  .map(([key, value]) => value) // only use the value

Template.helpers({
  allWeeks () {
    return weeks
  }
})

 

Затем вы можете выполнить итерацию по нему с помощью {{#each week in allWeeks}} .

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

 const state = new ReactiveDict()
const weeks = Object.entries(document) // will be an array of key/value pairs
  .filter(([key, value]) => key.includes('week')) // only use week fields
  .map(([key, value]) => value) // only use the value

state.set({ weeks })


Template.helpers({
  allWeeks () {
    return state.get('weeks')
  }
})
 

Показания:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

https://docs.meteor.com/api/reactive-dict.html