Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.11.2015, 15:34
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

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@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #2 (permalink)  
Старый 25.11.2015, 15:39
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Проблема заключается в том, что класс 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@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #3 (permalink)  
Старый 25.11.2015, 15:43
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

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

В итоге делать override на класс Ext.data.TreeModel, но это частное решение. Ибо класс Ext.data.NodeInterface может где-нибудь еще использоваться...
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #4 (permalink)  
Старый 25.11.2015, 15:44
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Получается, что для класса Ext.data.NodeInterface невозможны:
1) наследование
2) override
Как так вышло???
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #5 (permalink)  
Старый 30.11.2015, 20:59
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

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

Насколько я помню механизм этой фигни, она украшает прототип класса, на который натравлена. Вот от этого класса и нужно наследовать уже рабочий.
Ответить с цитированием
  #6 (permalink)  
Старый 30.11.2015, 21:43
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

Сообщение от nohuhu Посмотреть сообщение
а вы попробуйте что-нибудь серьёзное наваять на голом JavaScript с его идиотскими прототипами и полным отсутствием нормальных механизмов
о-ла-ла ..странновато такое слышать от сотрудника сенча.. если работа не нравится надо менять
Ответить с цитированием
  #7 (permalink)  
Старый 30.11.2015, 21:56
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

если по теме, сделать оверрайд для модели поглощающей 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;
        }
    });
});
Ответить с цитированием
  #8 (permalink)  
Старый 30.11.2015, 22:42
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Цитата:
Насколько я помню механизм этой фигни, она украшает прототип класса, на который натравлена. Вот от этого класса и нужно наследовать уже рабочий.
от какого от этого надо наследовать???
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #9 (permalink)  
Старый 30.11.2015, 22:43
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

siber-biber, спасибо за ответ, это интересный прием, однако! забыл что override можно и потом вызывать... после создания класса
__________________
Хусамов Сухроб, Москва, khusamov@yandex.ru
Мой JS-стек: Sencha ExtJS 6, Node.js, TypeScript.
Ответить с цитированием
  #10 (permalink)  
Старый 30.11.2015, 22:55
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск