Два связанных параметра в config-е класса
В продолжение обсуждения конфигурационных свойств, который был начат в ветке http://javascript.ru/forum/extjs/570...mplyaru-2.html появился вопрос.
Как правильно написать методы update* у двух связанных параметров? Их связь заключается в том, что изменив один из них, другой пересчитывается и наоборот. Например есть класс Арка. Арку можно определить как через радиус арки, так и через высоту арки. Я пишу такой код: Ext.define("Arc", { config: { height: 0, radius: 0 }, applyHeight: function(height) { this._radius = <расчет радиуса на основании высоты>; return height; }, applyRadius: function(radius) { this._height = <расчет высоты на основании радиуса>; return radius; } }); Тут мне приходится выкручиваться. Если я вызову this.setRadius() вместо присвоения this._radius = , то все зациклится. И чтобы не запустился apply* связанного параметра, приходится присваивать this._radius =. Это какой-то недокументированный способ. Я просто подсмотрел, где хранятся конфиги. Оказалось что в переменных с префиксом подчеркивание. А как правильно это сделать? |
Стандартных средств для таких случаев нет, поскольку они весьма редки. Я бы использовал простые флаги:
Ext.define('Arc', { config: { height: 0, radius: 0 }, applyHeight: function(newHeight) { var radius = <считаем радиус>; // Аксессоры конфигов вызываются в контексте объекта if (!this.disableHeightCalc) { this.disableRadiusCalc = true; this.setRadius(radius); this.disableRadiusCalc = false; }; return newHeight; }, applyRadius: function(newRadius) { var height = <считаем высоту>; if (!this.disableRadiusCalc) { this.disableHeightCalc = true; this.setHeight(height); this.disableHeightCalc = false; }; return newRadius; }, constructor: function(cfg) { // Мы доверяем входным конфигам, их не надо пересчитывать this.disableHeightCalc = this.disableRadiusCalc = true; this.initConfig(cfg); this.disableHeightCalc = this.disableRadiusCalc = false; } }); Что касается префикса для конфигурационных свойств, то насколько я понимаю, это была такая (тщетная) попытка удержать пользователей от изменения конфигов напрямую, в обход аксессоров. Security by obscurity конечно же не работает, но префиксы оставили как есть для пущей совместимости с Sencha Touch, откуда была притащена система конфигов. Для большинства классов Ext JS (Classic toolkit в 6) префиксы конфигурационных свойств выключены. |
Это зачем?
// Мы доверяем входным конфигам, их не надо пересчитывать this.disableHeightCalc = this.disableRadiusCalc = true; this.initConfig(cfg); this.disableHeightCalc = this.disableRadiusCalc = false; На входе либо радиус либо высота и пересчитать второй параметр обязательно надо, так как getParam не выдаст верное значение того параметра, который не рассчитан. Кстати, были какие-то неясные проблемы, когда при вызове this.initConfig(cfg) в одном из updateParam() вызывался setOtherParam()... вроде проблема была в том, что параметр не был еще инициализирован что-ли... а на него вызывался setParam()... |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 03:19. |