Виртуальный массив это массив в котором нет ссылки на html тег.
Он нужен для создания контейнеров не сгрупированных в одном html элементе а разбросанных по разным свойствам group
разных контейнеров.
Например у нас есть три контейнера и в каждом есть свойство с типом group
<div data-pages=array>
<div data-page="container">
<div data-page-some_group="group">
</div>
</div>
<div data-page="container">
<div data-page-some_group="group">
</div>
</div>
<div data-page="container">
<div data-page-some_group="group">
</div>
</div>
</div>
var StateMap ={
pages: {
container: "page",
props: ["some_group"],
methods: {
}
}
}
Теперь в каждом свойстве some_group
мы хотим поместить различное количество пунктов меню data-item="container" например в первом 1, во втором 2, в третьем 3
если использовать обычные массивы то нам прийдется создать три одинаковых массива с различным набором data-item="container" и одинаковой функциональностью.
Чтобы этого не делать мы создадим один виртуальный массив items а его контейнеры мы распределим между свойствами "some_group"
Итак html код будет выглядеть так:
<div data-pages=array>
<div data-page="container">
<div data-page-some_group="group">
<div data-item="container" data-item-text="text">текст 1</div> <!-- добавили контейнер item -->
</div>
</div>
<div data-page="container">
<div data-page-some_group="group">
<div data-item="container" data-item-text="text">текст 1</div>
<div data-item="container" data-item-text="text">текст 2</div>
</div>
</div>
<div data-page="container">
<div data-page-some_group="group">
<div data-item="container" data-item-text="text">текст 1</div>
<div data-item="container" data-item-text="text">текст 2</div>
<div data-item="container" data-item-text="text">текст 3</div>
</div>
</div>
</div>
Теперь добавим виртуальный массив items в javascript код:
var StateMap ={
pages: {
container: "page",
props: ["some_group"],
methods: {
}
},
virtualArrayComponents: { //объект для хранения виртуальных массивов
items: { //виртуальный массив
container: "item", //контейнер виртуального массива
props: ["text"],
methods: {
}
}
}
}
Теперь открыв в консоли экземпляр приложения можно увидеть что всего в массиве state.items.data у нас 6 контейнеров "item", а в свойстве some_group.groupChild первого контейнера "page" - один, второго - два, третьего - три.
Таким образом с помощью свойства с типом group
мы сгрупировали в трех контейнерах "page" массива "pages" различное количество контейнеров "item" из массива 'items'
Заметьте что index контейнера в массиве отличается от индекса контейнера в группе groupId Теперь если мы захотим удалить контейнер из группы, с помощью метода .removeFromGroup(groupID) то он также удалится из виртуального массива.
Важно размещать контейнеры в html разметке непосредственно в теге с типом group
избегая каких либо промежуточных тегов, т.к. при инициализации приложение будет искать только непосредственных потомков (this.htmlLink.children
) с типом container
, И если их обернуть в другой тег, то оно их просто не найдет.