PDA

Просмотр полной версии : Конкатенация строки и числа


art_maestro
09.07.2018, 21:28
Здравствуйте.

Подскажите как решить такую задачу.

В контейнер помещены блоки (N-кол.во). Я пытаюсь удалить их из контейнера следующим образом

conteiner.removeChild(conteiner.getChildByName("block"+nk));


Все работает, если nk=0..9. Если nk>9, то появляется ошибка:
Не удалось найти свойство blockundefined

Перед кодом удаления я вывожу отдельно nk (для контроля), все отображается верно 10 или 11 ( т.е. как нужно), но в процессе удаления возникает данная ошибка.

Пробовал следующие варианты:


conteiner.removeChild(conteiner.getChildByName(String("block"+nk)));
conteiner.removeChild(conteiner.getChildByName("block11")); // уже статически прописывал число ради интереса
conteiner.removeChild(conteiner.getChildByName(String("block11")));
conteiner.removeChild(conteiner.getChildByName("block"+String(nk)));


Буду благодарен за помощь!

Wolsh
09.07.2018, 21:36
Не удалось найти свойство blockundefinedговорит о том, что nk равно не 10 или 11, а undefined.

art_maestro
09.07.2018, 21:38
Я понимаю суть ошибки. Но я не могу понять почему она возникает. И очень странно, что работает удаление от 0 до 9. А далее возникает ошибка, хотя nk выводит верно.

Я делаю вот так:


trace(nk); //выводит 10
conteiner.removeChild(conteiner.getChildByName("block"+nk)); // ошибка blockundefined


Может как-то надо преобразовать nk, но как?

Wolsh
09.07.2018, 21:57
Странно, но у меня подобная конструкция даже ошибку выдает другую:
[Fault] exception, information=TypeError: Error #2007: Parameter child must be non-null.
То есть getChildByName() тупо возвращает null и никакого исключения не выкидывает.
Мало того, конкатенация строки с undefined преобразовывает его в ноль, то есть получается "block0".

art_maestro
09.07.2018, 22:10
Что-то я еще больше озадачился. Наверное придется искать другой выход с данной ситуации. Просто уже ради любопытства.. почему возникает такая проблема.

Нашел на просторах интернета, что ошибка возникает, только при работе с динамически-созданными объектами.

ZergMaster
09.07.2018, 23:01
проверьте имя всех этих объектов, которые в контейнере
то ли оно, которое вы ожидаете?
Желательно поставить брэйкпойнт и посмотреть, что лежит в контейнере на момент, когда вы пытаетесь что-то из него удалить.
Если с бряками плохо, на крайняк можно и оттрэйсить:
for(var i:int=0; i<container.numChildren; i++)
{
trace('container.getChildAt('+i+').name = '+container.getChildAt(i).name);
}
Еще, чтобы исключить возможно undefined nk, можно сделать
var name:String = "block"+nk;
trace('name = '+name);
container.removeChild(container.getChildByName(name));

art_maestro
09.07.2018, 23:15
Спасибо за совет.
С помощью цикла я проверил, какие компоненты были добавлены в контейнер. Все отлично добавляется, вывело верно. Но ошибка все равно возникает.

Сейчас пытаюсь переделать код так, чтобы не использоваться собственные имена объектов "block"+nk - так как проблема именно в этом.

getChildByName(...) отлично работает с объектами, которым система автоматически присваивает имена ( instanceX)

ZergMaster
10.07.2018, 12:54
какие-то невероятные вещи..

интересно, а что в итоге выводит?

var elementName:String = "block"+nk;
trace('elementName = '+elementName);
for(var i:int=0; i<container.numChildren; i++) {
trace('container.getChildAt('+i+').name = '+container.getChildAt(i).name);
}
var someChild:DisplayObject = container.getChildByName(elementName) as DisplayObject;
trace('someChild = '+someChild);
container.removeChild(container.getChildByName(name));

СлаваRa
10.07.2018, 13:36
container.getChildByName(elementName) as DisplayObject; Больше ненужных кастов богу кастов

art_maestro
10.07.2018, 13:53
Спасибо,но я уже переделал код. На будущее буду иметь ввиду.

ZergMaster
10.07.2018, 14:05
СлаваRa
=Ъ
Дык, а вдруг у человека не заработает и придется переформулировать вопрос? Я ж не знаю всего кода. Перестраховочка.

*ДА я понимаю, что он по-любому DisplayObject

СлаваRa
10.07.2018, 14:37
Перестраховочка.
Метод и так возвращает DisplayObject, тут или не знаение API или небрежность, но никак не перестраховка от чего-либо.

ZergMaster
10.07.2018, 15:24
Метод и так возвращает DisplayObject, тут или не знаение API или небрежность, но никак не перестраховка от чего-либо.
Перестраховка от незнания API как раз! ВЫ совершенно правы, милостивый государь!