Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Web-программирование - это просто!


Новое на сайте Программирование - это просто! (www.easyprog.ru):

В платном разделе

В бесплатном разделе

Программные продукты

Добрый день, уважаемые подписчики!

Тема сегодняшнего выпуска: «Java Script(JS): Библиотека визуальных компонентов. Класс контейнер».

 

Скачать файлы с описанными классами можно здесь.

Так же для углубленного изучения web-программирования (язык PHP и написание своей собственной CMS) советую подписаться на платный раздел (см. анонсы раздела "Пишем Easy CMS").

 

Изучим следующий класс библиотеки визуальных компонентов: CXBrObjectsContainer. Он может содержать в себе другие классы и передавать между ними сообщения. Механизм передачи сообщений между объектами предполагает, что любой экземпляр любого класса, между которыми может быть передача сообщений, обязательно должен быть включен в контейнер. Сам контейнер может быть включен в другой контейнер. Те классы, которые могут являться контейнерами, обязательно должны объявлять от класса CXBrObjectsContainer или его дочерних классов.

Данный класс являться базовым для создания всех классов контейнеров. Кроме того, сам класс уже является полноценным готовым контейнером. Цель создания дочерних объектов от данного класса обычно является расширения функционала контейнера, в частности, ввод действий, которые нужно сделать со всеми членами контейнера, например, отобразить их на экране. В обязательном порядке переопределяется метод_get_class_name, так как у нового класса должно быть другое имя.

И так, вот как объявлен этот класс:

 

// ********** Объявления класса CXBrObjectsContainer *******************

function CXBrObjectsContainer() {

    CXBrBaseInterfaceClass.call(this);

    this._get_class_name=CXBrObjectsContainer_get_class_name;

    this._hierarchy_classes.push(this._get_class_name());

    this._objects_list=new Array;

    this._add=CXBrObjectsContainer_add;

    this._add_object=CXBrObjectsContainer_add_object;

    this._remove=CXBrObjectsContainer_remove;

    this._send_message=CXBrObjectsContainer_send_message;

    this._remove_all=CXBrObjectsContainer_remove_all;

    this._get_by_id=CXBrObjectsContainer_get_by_id;

    this._get_by_name=CXBrObjectsContainer_get_by_name;

    this._global_get_by_name=CXBrObjectsContainer_global_get_by_name;

}

Он является потомком  CXBrBaseInterfaceClass, поэтому вызывает у последнего конструктор:

CXBrBaseInterfaceClass.call(this);

 

Далее мы переопределяем метод получения имени класса и добавляем имя данного класса в массив иерархии, для того, что бы работали методы _is_child, _is_child_or_self, _is_parent и _is_parent_or_self, принадлежащие базовому классу:

 

this._get_class_name=CXBrObjectsContainer_get_class_name;

this._hierarchy_classes.push(this._get_class_name());

 

затем мы создаем массив для хранения входящих в контейнер объектов:

this._objects_list=new Array;

 

и определяем методы класса:

this._add=CXBrObjectsContainer_add;

this._add_object=CXBrObjectsContainer_add_object;

this._remove=CXBrObjectsContainer_remove;

this._send_message=CXBrObjectsContainer_send_message;

this._remove_all=CXBrObjectsContainer_remove_all;

this._get_by_id=CXBrObjectsContainer_get_by_id;

this._get_by_name=CXBrObjectsContainer_get_by_name;

this._global_get_by_name=CXBrObjectsContainer_global_get_by_name;

 

Описание полей и методов

Описание полей:

Поле

Тип

Назначение

_objects_list

Array

Массив объектов

 

Описание методов:

Метод

Аргументы

Возвращаемое значение

Назначение

CXBrObjectsContainer

Нет

Нет

Конструктор класса

_add

CXBrBaseInterfaceClass или его потомок

Добавленный объект

Добавляет объект в список. Кроме того, данный метод должен проверить, действительно ли добавляется объект потомок от нужного класса, а не число или строка, к примеру.

_remove

CXBrBaseInterfaceClass или его потомок, когда удаляем класс по ссылке на объект; или Number – номер удаляемого объекта; либо String – уникальный идентификатор объекта

Boolean -  признак успешного удаления

Удаляет из контейнера объект, с его уничтожением и уничтожением всех объектов, на которые он ссылается

_send_message

Array – массив, содержащий данные сообщения; Boolean – признак того, что сообщение уже обработано владельцем. Используется для устранения циклического рекурсивного «зависания».

Boolean -  признак того, что  сообщение послано и дальше его обрабатывать не нужно

Посылает сообщение контейнеру, контейнер при этом обрабатывает сообщение и при необходимости посылает нужным объектам, содержащимся в контейнере.

_remove_all

Нет

Нет

Удаляет все объекты из контейнера

_get_by_id

Number

CXBrBaseInterfaceClass или его потомок

Получает объект по ИД. Если не найден, то возвращает null

_get_by_name

String

CXBrBaseInterfaceClass или его потомок

Получает объект по имени. Если не найден, то возвращает null

_find_by_name

String

Number

Возвращает номер объекта с данным именем в контейнере. Если нет то -1

_global_get_by_name

String

CXBrBaseInterfaceClass или его потомок

Производит глобальный поиск по программному имени. Ищет не только в текущем контейнере, но так же в подчиненных контейнерах, контейнере владельце и всех подчиненных ему контейнеров до самого нижнего уровня. Возвращает объект с данным именем в контейнере. Если нет то null

 

А теперь тестовый пример, иллюстрирующий работу класса:

<html>

 

<head>

  <title></title>

    <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="XBrBase.js">

    </SCRIPT>

    <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="XBrGlobalVars.js">

    </SCRIPT>

    <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="XBrGlobalProc.js">

    </SCRIPT>

</head>

 

<body>

    <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

        var _id_=111

 

        function out_objects_list(ob) {

            var s=""

            for(i=0;i<ob._objects_list.length;i++) {

                s=s+ob._objects_list[i]._id+", "

            }

            return s

        }

 

        function CXBrObjectsContainer1() {

            CXBrObjectsContainer.call(this)

            this._get_name=CXBrObjectsContainer1_get_name

            this._hierarchy_classes.push(this._get_name())

            this._event_handler=CXBrObjectsContainer1_event_handler

        }

 

        function CXBrBaseInterfaceClass1() {

            CXBrBaseInterfaceClass.call(this)

            this._get_name=CXBrBaseInterfaceClass1_get_name

            this._hierarchy_classes.push(this._get_name())

            this._event_handler=CXBrBaseInterfaceClass1_event_handler

        }

 

        function CXBrBaseInterfaceClass1_get_name() { return "CXBrBaseInterfaceClass1" }

        function CXBrObjectsContainer1_get_name() { return "CXBrObjectsContainer1" }

 

        function CXBrObjectsContainer1_event_handler(msg) {

            document.write("CXBrObjectsContainer1 ("+this._id+"): Получено сообщение "+msg._type+

                " от "+msg._source_name+"("+msg._source_id+")<br>")

            return false

        }

 

        function CXBrBaseInterfaceClass1_event_handler(msg) {

            document.write("CXBrBaseInterfaceClass1 ("+this._id+"): Получено сообщение "+msg._type+

                " от "+msg._source_name+"("+msg._source_id+")<br>")

            if(this._id==_id_) return true; else return false

        }

 

        var cont = new CXBrObjectsContainer()

        document.write("<font size=5><b>Тестирование CXBrObjectsContainer</b></font><br>")

        document.write("<b>Тестирование метода _add</b><br>")

        cont._add(new CXBrBaseInterfaceClass())

        cont._add(new CXBrBaseInterfaceClass())

        cont._add(new CXBrBaseInterfaceClass())

        cont._add(new CXBrBaseInterfaceClass())

        document.write("cont._objects_list="+out_objects_list(cont)+"<br>")

        document.write("<b>Тестирование метода _get_by_id</b><br>")

        document.write("cont._get_by_id(2)="+cont._get_by_id(2)+"<br>")

        document.write("cont._get_by_id(2)._id="+cont._get_by_id(2)._id+"<br>")

        document.write("cont._get_by_id('2')._id="+cont._get_by_id('2')._id+"<br>")

        document.write("<b>Тестирование метода _remove</b><br>")

        cont._remove(2)

        document.write("Удалим по индексу (2) cont._objects_list="+out_objects_list(cont)+"<br>")

        cont._remove("2")

        document.write("Удалим по ID (2) cont._objects_list="+out_objects_list(cont)+"<br>")

        cont._remove(cont._objects_list[1])

        document.write("Удалим по объекту (индекс=1) cont._objects_list="+out_objects_list(cont)+"<br>")

        cont._add(new CXBrBaseInterfaceClass())

        cont._add(new CXBrBaseInterfaceClass())

        document.write("Добавим еще несколько объектов cont._objects_list="+out_objects_list(cont)+"<br>")

 

        document.write("<b>Тестирование передачи сообщения</b><br>")

        var cont1=new CXBrObjectsContainer1()

        var ob1=new CXBrBaseInterfaceClass1()

        cont1._add(new CXBrBaseInterfaceClass1())

        cont1._add(new CXBrBaseInterfaceClass1())

        cont1._add(new CXBrBaseInterfaceClass1())

        cont1._add(new CXBrBaseInterfaceClass1())

        document.write("ob1._owner="+ob1._owner+"<br>")

        cont1._add(ob1)

        document.write("ob1._owner="+ob1._owner+"<br>")

        var msg=new Array

        msg['_type']=1

        msg['_source_id']=ob1._id

        msg['_source_name']=ob1._get_name()

        ob1._owner._send_message(msg)

        document.write("<i>А теперь проверим, как прекращается обработка сообщений. Прекратиться должно на объекте ИД=11</i><br>")

        _id_=11

        ob1._owner._send_message(msg)

 

        document.write("<b>Тестирование метода _remove_all</b><br>")

        cont._remove_all()

        document.write("Теперь удалим все cont._objects_list="+out_objects_list(cont)+"<br>")

    </SCRIPT>

</body>

 

</html>

 

и результат его работы:

 

Тестирование CXBrObjectsContainer
Тестирование метода _add
cont._objects_list=2, 3, 4, 5,
Тестирование метода _get_by_id
cont._get_by_id(2)=[object Object]
cont._get_by_id(2)._id=2
cont._get_by_id('2')._id=2
Тестирование метода _remove
Удалим по индексу (2) cont._objects_list=2, 3, 5,
Удалим по ID (2) cont._objects_list=3, 5,
Удалим по объекту (индекс=1) cont._objects_list=3,
Добавим еще несколько объектов cont._objects_list=3, 6, 7,
Тестирование передачи сообщения
ob1._owner=null
ob1._owner=[object Object]
CXBrObjectsContainer1 (8): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
CXBrBaseInterfaceClass1 (10): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
CXBrBaseInterfaceClass1 (11): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
CXBrBaseInterfaceClass1 (12): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
CXBrBaseInterfaceClass1 (13): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
А теперь проверим, как прекращается обработка сообщений. Прекратиться должно на объекте ИД=11
CXBrObjectsContainer1 (8): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
CXBrBaseInterfaceClass1 (10): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
CXBrBaseInterfaceClass1 (11): Получено сообщение 1 от CXBrBaseInterfaceClass1(9)
Тестирование метода _remove_all
Теперь удалим все cont._objects_list=

 

 

С уважением, Шуравин Александр, e-mail: megabax@rambler.ru, автор оставляет за собой право публиковать в рассылках ваши письма, если в письме прямо неоговорено нежелание его публиковать.

 


В избранное