Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Ext.data.TreeModel + Ext.data.NodeInterface (https://javascript.ru/forum/extjs/59758-ext-data-treemodel-ext-data-nodeinterface.html)

khusamov 25.11.2015 15:34

Ext.data.TreeModel + Ext.data.NodeInterface
 
Может кто-нибудь объяснить, почему надо было так усложнять?

Есть класс Ext.data.TreeModel

Он после создания сразу же декорируется при помощи метода:

http://docs.sencha.com/extjs/6.0/6.0...ethod-decorate

в результате класс Ext.data.TreeModel приобретает методы Ext.data.NodeInterface. Есть же миксины для этого. Зачем надо так шифроваться и создавать хитрый метод decorate?

В итоге, в документации на Ext.data.TreeModel нет ссылок на методы Ext.data.NodeInterface. Это еще надо догадаться, что в нем есть метод, например, getPath.

khusamov 25.11.2015 15:39

Проблема заключается в том, что класс Ext.data.NodeInterface создан тоже не обычным способом. В итоге override метода getPath класса Ext.data.NodeInterface не попадает в класс Ext.data.TreeModel

Ext.define("Khusamov.override.data.TreeModel", {
	
	override: "Ext.data.NodeInterface",

    getPath: function(field, separator, withoutFirstSeparator) {
        field = field || this.idProperty;
        separator = separator || '/';

        var path = [this.get(field)],
            parent = this.parentNode;

        while (parent) {
        	var cur = Ext.String.trim(parent.get(field));
        	// Пустые элементы пропускаем.
        	if (cur) path.unshift(cur);
            parent = parent.parentNode;
        }
        return (withoutFirstSeparator ? "" : separator) + path.join(separator);
    }
	
});

khusamov 25.11.2015 15:43

Сначала думал что нужно сделать override в разделе statics, но не тут-то было. Дело в том, что тело класса Ext.data.NodeInterface находтся внутри статичной функции getPrototypeBody (return {тело тут}). И как туда добраться не ясно. Точнее похоже туда не получится добраться...

В итоге делать override на класс Ext.data.TreeModel, но это частное решение. Ибо класс Ext.data.NodeInterface может где-нибудь еще использоваться...

khusamov 25.11.2015 15:44

Получается, что для класса Ext.data.NodeInterface невозможны:
1) наследование
2) override
Как так вышло???

nohuhu 30.11.2015 20:59

Легко: NodeInterface это наследие тяжёлого прошлого, динозавр из эпохи до классовой системы с mixins и override. Это сейчас жизнь легка и весела, а вы попробуйте что-нибудь серьёзное наваять на голом JavaScript с его идиотскими прототипами и полным отсутствием нормальных механизмов. Ещё и не такое получится...

Насколько я помню механизм этой фигни, она украшает прототип класса, на который натравлена. Вот от этого класса и нужно наследовать уже рабочий.

siber-biber 30.11.2015 21:43

Цитата:

Сообщение от nohuhu (Сообщение 398157)
а вы попробуйте что-нибудь серьёзное наваять на голом JavaScript с его идиотскими прототипами и полным отсутствием нормальных механизмов

о-ла-ла ..странновато такое слышать от сотрудника сенча.. если работа не нравится надо менять :stop:

siber-biber 30.11.2015 21:56

если по теме, сделать оверрайд для модели поглощающей NodeInterface никаких проблем не составляет:
Ext.define('MyModel', {
    // class members
    ...
}, function () {
    // do this first to be able to override NodeInterface provided stuff
    Ext.data.NodeInterface.decorate(this);

    this.override({
        // override appendChild method
        appendChild : function () {
            var result = this.callParent(arguments);
            // ....... do smth
            return result;
        }
    });
});

khusamov 30.11.2015 22:42

Цитата:

Насколько я помню механизм этой фигни, она украшает прототип класса, на который натравлена. Вот от этого класса и нужно наследовать уже рабочий.
от какого от этого надо наследовать???

khusamov 30.11.2015 22:43

siber-biber, спасибо за ответ, это интересный прием, однако! забыл что override можно и потом вызывать... после создания класса

nohuhu 30.11.2015 22:55

Цитата:

Сообщение от siber-biber (Сообщение 398161)
о-ла-ла ..странновато такое слышать от сотрудника сенча.. если работа не нравится надо менять :stop:

Работа нравится, JavaScript нет. ;) Но, как было сказано когда-то давно, при всём богатстве выбора другой альтернативы нет. Вот и приходится тратить массу сил на производство конфет из того, что есть. Пичалька. :)


Часовой пояс GMT +3, время: 01:16.