Странное поведение ItemRenderer - PullRequest
0 голосов
/ 15 января 2009

У меня действительно странная проблема с ItemRenderer. У меня есть контейнер main.mxml с ViewStack. Когда пользователь входит в систему, начальное представление содержит AdvancedDataGrid - содержащий некоторые данные и ItemRenderer ниже - который просто отображает кнопку Удалить. Когда пользователь входит в систему, эта AdvancedDataGrid автоматически обновляется из базы данных. Кнопка «Удалить» должна быть включена или отключена в зависимости от членства пользователя в роли.

Сценарий 1 (вход в систему с правами администратора):

  1. Администратор входит в систему - сразу отображается представление таблицы данных и кнопка «Удалить» правильно включена для каждой строки
  2. Выход
  3. Войти как пользователь без прав администратора - данные обновляются, и все строки по-прежнему включены , кроме одного . Это может быть первый, второй или третий ряды - это совершенно случайно. Это действительно странно. , .

Я перезагружаю браузер и следую сценарию 2. , .

Сценарий 2 (вход в систему без прав администратора):

  • Пользователь, не являющийся администратором, входит в систему - сразу отображается представление таблицы данных, и кнопка «Удалить» правильно отключена для каждой строки
  • Выход
  • Войти как пользователь с правами администратора - все строки по-прежнему отключены , кроме одной . Это может быть первый, второй или третий ряды - это совершенно случайно. Как раз наоборот первого сценария.

ИНТЕРЕСНЫЙ ФАКТ - Если я поставлю точку останова в checkDeleteSecurity, она достигнет ее, ТОЛЬКО когда ЗАПИСЫВАЕТСЯ ПЕРВЫЙ ПОЛЬЗОВАТЕЛЬ И ДАННАЯ СЕТКА ПЕРВАЯ ОБНОВЛЕНА. Когда я выхожу и следующий пользователь входит в систему, сетка данных обновляется, но точка останова checkDeleteSecurity никогда не перехватывается.

[Bindable]
private function checkDeleteSecurity ():Boolean
{
     return (SecurityProxy.CheckSecurity(SecurityProxy.UserName));
}

<mx:LinkButton label="Delete" click="onDeleteClick()" id="lbDelete" enabled="{checkDeleteSecurity()}"/>

Ответы [ 2 ]

2 голосов
/ 15 января 2009

Звучит так, будто у вас здесь может происходить пара вещей. Во-первых, стоит отметить, что ItemRenderers используются повторно; в сетке (или списке и т. д.), содержащей, скажем, список из десяти дорожек альбома, по одной строке для каждой дорожки, каждая строка отображается правильно при первоначальном создании списка - но при использовании базового альбома, чтобы расширить пример Изменения, сами рендеры треков альбомов будут автоматически реагировать на изменения, только если они правильно настроены для этого. Обычно это включает переопределение установщика свойства данных средства визуализации:

override public function set data(value:Object):void
{
    super.data = value;

    // .. Take some action
}

Вероятно, поэтому ваш метод CheckSecurity не вызывается при изменении данных - потому что свойство enabled кнопки - единственный путь к нему, и кнопка уже обработана.

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

Можно ли привязать свойство компонента Flex к функции?

Надеюсь, это поможет! Я буду следить за веткой последующих комментариев, если они у вас есть.

0 голосов
/ 15 января 2009

что вам нужно сделать, это когда ваши данные обновляются, вызовите lbDelete.enabled = checkDeleteSecurity (); Это обеспечит вызов функции безопасности при каждом обновлении данных.

Я думаю, что происходит то, что создается ваш компонент, который вызывает функцию безопасности, но как только он будет создан, обновлять кнопку ссылки не на что.

Как только элемент рендеринга создан, скажем, он генерирует 6, тогда при обновлении данных он будет использовать те 6 элементов, которые уже созданы для следующего набора данных (но с обновленными данными). Если следующему набору данных требуется 8 itemRenderers, ему нужно будет только создать еще 2 рендера. Таким образом, только эти 2 элемента будут вызывать функцию безопасности, поскольку они еще не созданы.

...