Добавление пользовательских событий

При создании контейнера в массиве, контейнер получает индекс, начиная с 0 - (для первого контейнера) затем при добавлении новых контейнеров, если новый контейнер добавить в начало массива на позицию 0 - индекс всех идущих за ним контейнеров увеличится на 1, при удалении контейнера из массива, наоборот индекс всех идущих за удаленным контейнером уменьшится на 1. Давайте создадим в каждом контейнере свойство которое будет отображать индекс контейнера в html разметке и назовем это свойство page_index. Затем при добавлении или удалении контейнеров, будем обновлять данное свойство, чтобы в нем отображались актуальные данные. Сделать это можно разными способами. Например после каждого добавления или удаления проходить массив в цикле forEach и обновлять индекс всех контейнеров. Второй способ это прикрепить контейнеру слушатель события listener_create_page и при его наступлении обновлять свойство page_index, в данном примере мы так и сделаем.

Добавим в html код контейнеров page из примера выше (#Добавление контейнеров в массив) свойство - событие listener_create_page с названием события "emiter-create-page" и свойство page_index с типом "text":

<form data-create_page="container" style="border: 1px solid blue; padding: 10px; margin: 10px;>  <!-- ...без изменений... --> </form>

<div data-pages="array" style="border: 1px solid red; padding: 10px;"> 

    <div data-page="container" data-page-listener_create_page="emiter-create-page" style="border: 1px solid green"> 
     <!-- добавили свойство - слушателя события "emiter-create-page" -->

        <p data-page-paragraf="text" data-page-my_class="class">текст<p>

        <p>index= <span data-page-page_index="text" > 0</span> </p> 
         <!-- добавили свойство page_index для отображения меняющихся данных -->

        <button data-page-btn_click="click">Кнопка</button>             
        <button data-page-remove="click">Удалить</button> 

    </div>
     <!-- аналогично и для второго контейнера -->
    <div data-page="container" data-page-listener_create_page="emiter-create-page" style="border: 1px solid green"> 

        <p data-page-paragraf="text" data-page-my_class="class">текст<p>            
        <p>index= <span data-page-page_index="text" > 1</span> </p>         
        <button data-page-btn_click="click">Кнопка</button>             
        <button data-page-remove="click">Удалить</button>

    </div>
</div>        

Теперь изменим описание приложения:

var StateMap = {

    create_page: { 
        container: "create_page", 
        props: ["text", "create"], 
        methods: {
            create: function(){ 

                    event.preventDefault(); 

                    var text = this.parent.props.text.getProp();  

                    this.rootLink.state["pages"].add({paragraf: text}, 0); //добавляем контейнер в начало массива, соответственно индекс всех остальных увеличивается на 1 

                    this.rootLink.eventProps["emiter-create-page"].emit();
                    //вызвали пользовательское событие "emiter-create-page" при создании контейнера 
                    }                       
                }
    },

    pages: {                    
        container: "page",  
        //добавили свойства "page_index" и "listener_create_page"
        props: ["paragraf", "my_class", "btn_click", "remove", "page_index", "listener_create_page"], 
            methods: {                          

                btn_click: function(){                       

                    console.log(this);                                                          
                    this.parent.props.paragraf.setProp("Новый текст");                              
                    this.parent.props.my_class.setProp("new_class");

                },
                remove: function(){         

                    this.parent.remove(); //удалили контейнер соответственно индекс контейнеров идущих после него уменьшился на 1 
                    this.rootLink.eventProps["emiter-create-page"].emit(); 
                    //вызвали пользовательское событие "emiter-create-page" при удалении контейнера

                },
                // добавили обработчик события "emiter-create-page" для свойства listener_create_page всех контейнеров
                listener_create_page: function(){ 

                    this.parent.props.page_index.setProp( this.parent.index );
                     //обновили интерфейс всех контейнеров на основе меняющегося index      
                }
            }           
    },
    eventEmiters: {  //создали объект со всеми пользовательскими событиями приложения

            ["emiter-create-page"]: { //наше событие с начальными данными

                    prop: "",
            }
    }
}

Итак после каждого создания либо удаления контейнера page мы вызываем событие "emiter-create-page" и все подписчики обновляют свои данные. Теперь если создать новый контейнер он получит index равный 2, а затем удалить нулевой контейнер с index 0 то созданный нами контейнер изменит index с 2 на 1 и мы с помощью пользовательского события обновим его интерфейс. Также можно передавать новые данные в пользовательское событие, которые затем получат все слушатели в обработчиках событий this.emiter.prop

Более подробно о работе с пользовательскими событиями можно почитать в разделе уроки - Работа с пользовательскими событиями