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. |
Проблема заключается в том, что класс 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); } }); |
Сначала думал что нужно сделать override в разделе statics, но не тут-то было. Дело в том, что тело класса Ext.data.NodeInterface находтся внутри статичной функции getPrototypeBody (return {тело тут}). И как туда добраться не ясно. Точнее похоже туда не получится добраться...
В итоге делать override на класс Ext.data.TreeModel, но это частное решение. Ибо класс Ext.data.NodeInterface может где-нибудь еще использоваться... |
Получается, что для класса Ext.data.NodeInterface невозможны:
1) наследование 2) override Как так вышло??? |
Легко: NodeInterface это наследие тяжёлого прошлого, динозавр из эпохи до классовой системы с mixins и override. Это сейчас жизнь легка и весела, а вы попробуйте что-нибудь серьёзное наваять на голом JavaScript с его идиотскими прототипами и полным отсутствием нормальных механизмов. Ещё и не такое получится...
Насколько я помню механизм этой фигни, она украшает прототип класса, на который натравлена. Вот от этого класса и нужно наследовать уже рабочий. |
Цитата:
|
если по теме, сделать оверрайд для модели поглощающей 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; } }); }); |
Цитата:
|
siber-biber, спасибо за ответ, это интересный прием, однако! забыл что override можно и потом вызывать... после создания класса
|
Цитата:
|
Часовой пояс GMT +3, время: 01:16. |