Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Метод toString() в пользовательском компоненте и проблемы с ним (https://javascript.ru/forum/extjs/57614-metod-tostring-v-polzovatelskom-komponente-i-problemy-s-nim.html)

khusamov 11.08.2015 23:15

Метод toString() в пользовательском компоненте и проблемы с ним
 
Где-то в недрах метода addListener

http://docs.sencha.com/extjs/5.1/5.1...od-addListener

происходит обращение к массиву, в качестве индекса используя SCOPE. Хотя SCOPE это вообще-то объект. Так ведь?

Например

namedScope = scope && namedScopes[scope];


У меня в некоторых компонентах есть метод toString(), который при таком обращении к массиву неявно вызывается. И вот когда, этот метод выдает пустую строку, то при обращении к массиву появляется ошибка:

Cannot convert object to primitive value

И теперь вопрос, что собственно делать-то???

У меня в итоге методы on() не работают.

Deff 12.08.2015 00:16

khusamov,
Не ?
try {
  namedScope = scope && namedScopes[scope];

} catch (e) {
  namedScope =false;
}
Наверно не то
===============
Вот что-то http://docs.sencha.com/extjs/4.2.1/#...-method-handle

khusamov 12.08.2015 01:39

Вообще-то приведенный мною код это часть метода addListener
а хак не хочется делать, так как эта проблема не только этого метода... там много где таких мест...

Deff 12.08.2015 01:50

khusamov,
Ну интуитивно, переопределить метод toString() именно для этого конкретного приложения
_ToString(), в нем и забодать проверки

khusamov 12.08.2015 13:43

Цитата:

Ну интуитивно, переопределить метод toString() именно для этого конкретного приложения
_ToString(), в нем и забодать проверки
Не очень понял.

Возможно вы про такой вариант. Если городить свои toString(), то называть их иначе, чтобы с не совпали с системным названием, например toSvgString(), тогда они не будут вызываться. Так вы имели ввиду?

Но тут проблемки:

1) я уже наплодил кучу таких методов и у меня уже есть программа, которая использует эту библиотеку (переименование мне может дорого стоить в случае переименовывания по смыслу выходной строки),

2) не очень хотелось бы лишаться такого красивого и лаконичного названия метода (хотя это не существенно по большому счету, но проблема не в JavaScript, а в Ext JS, где вот так, на мой взгляд не корректно, достают значения массивов).

siber-biber 12.08.2015 14:12

Сделайте так чтоб toString не возвращал пустую строку.. или откажитесь от toString().

khusamov 12.08.2015 16:02

Цитата:

Сделайте так чтоб toString не возвращал пустую строку.. или откажитесь от toString().
Хм... а что возвращать? Я конечно попробую возвращать null, undefined... если это поможет, то еще куда ни шло. Но возвращать непустую строку, когда надо возвратить пустую это вряд-ли у меня получится.

siber-biber 12.08.2015 18:00

Ну для инстансов можно вот такую строку возвращать например "{}". Или например так "MyClassName: {}"

siber-biber 12.08.2015 18:02

Я не знаю для чего вы завязались на toString() так что гадать тяжело.

khusamov 12.08.2015 21:04

как для чего? Для сериализации объектов. Мне нужно объекты в строку превращать. Например Path из SVG это строка с командами рисования пути. И если в Path нет сегментов, то строка должна быть пустой.


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