Странное поведение ItemRenderer

У меня действительно странная проблема с 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()}"/>

person SkunkSpinner    schedule 15.01.2009    source источник


Ответы (2)


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

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

    // .. Take some action
}

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

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

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

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

person Christian Nunciato    schedule 15.01.2009
comment
Это был мой вопрос. . . Это была часть 2;) - person SkunkSpinner; 15.01.2009
comment
Установщик свойств данных будет вызываться каждый раз при привязке строки элемента? Это интересно. Итак, если у меня есть 10 строк данных в сетке данных с кнопкой Удалить в ItemRenderer. Я беру новые данные и получаю только 3 строки. Несмотря на то, что строки 4-10 выглядят пустыми, вы говорите, что кнопка «Удалить» все еще отображается? - person SkunkSpinner; 15.01.2009
comment
Замечательно, приятно слышать. Да, я удивлен, что мне потребовалось так много времени, чтобы самому выучить это; Я прочитал несколько книг по Flex и множество документов, и, насколько это полезно знать, можно подумать, что это будет более широко задокументировано. Ну что ж - рад, что помог! - person Christian Nunciato; 15.01.2009

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

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

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

person kenneth    schedule 15.01.2009