0

ItemRendererに本当に奇妙な問題があります。ViewStackを備えたmain.mxmlコンテナーがあります。ユーザーがログインすると、初期ビューにはAdvancedDataGrid(一部のデータと以下のItemRendererが含まれます)が含まれ、[削除]ボタンが表示されます。ユーザーがログインすると、このAdvancedDataGridはデータベースから自動的に更新されます。[削除]ボタンは、ユーザーのロールメンバーシップに基づいて有効または無効にする必要があります。

シナリオ1(管理者としてログイン):

  1. 管理者ユーザーがログインします-データグリッドビューがすぐに表示され、すべての行で[削除]ボタンが適切に有効になります
  2. ログアウト
  3. 非管理者ユーザーとしてログイン-データが更新され、1つを除くすべての行が引き続き有効になります。これは、1行目、2行目、または3行目である可能性があり、完全にランダムです。それは本当に奇妙です。。。

ブラウザを再起動し、シナリオ2に従います。。。

シナリオ2(非管理者としてログイン):

  • 管理者以外のユーザーがログインします-データグリッドビューがすぐに表示され、すべての行で[削除]ボタンが適切に無効になります
  • ログアウト
  • 管理者ユーザーとしてログイン-1つを除いて、すべての行が引き続き無効になっています。これは、1行目、2行目、または3行目である可能性があり、完全にランダムです。最初のシナリオのちょうど逆です。

興味深い事実-checkDeleteSecurityにブレークポイントを設定すると、最初のユーザーがログインし、DATAGRIDが最初に更新されたときにのみブレークポイントに到達します。ログアウトして次のユーザーがログインすると、データグリッドは更新されますが、checkDeleteSecurityブレークポイントがキャッチされることはありません。

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

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

2 に答える 2

2

ここでいくつかのことが起こっているようです。まず、ItemRenderer が再利用されることに注意してください。たとえば、10 個のアルバム トラックのリストを含むグリッド (またはリストなど) では、トラックごとに 1 つの行があり、各行はリストが最初に作成されたときに適切にレンダリングされますが、下にあるアルバムの場合は、例を拡張するために、変更された場合、アルバム トラック レンダラー自体は、適切に配線されている場合にのみ、変更に自動的に応答します。一般に、これにはレンダラーのデータ プロパティのセッターをオーバーライドすることが含まれます。

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

    // .. Take some action
}

これがおそらく、データの変更時に CheckSecurity メソッドが呼び出されない理由です。ボタンの enabled プロパティが唯一の方法であり、ボタンは既にレンダリングされているためです。

また、関数へのバインディングには独自の問題があります。誰かが実際に昨夜この質問をし、あなたがしていることと非常によく似たことをしました (ブール関数の結果にバインドしてボタンの状態を設定します):

Flex コンポーネントのプロパティを関数にバインドできますか?

それが役立つことを願っています! フォローアップのコメントがあれば、スレッドを監視します。

于 2009-01-15T16:49:26.647 に答える
0

あなたがすべきことは、データが更新されたときに lbDelete.enabled = checkDeleteSecurity(); を呼び出すことです。これにより、データが更新されるたびにセキュリティ関数が呼び出されるようになります。

セキュリティ機能を呼び出すコンポーネントが作成されていると思いますが、作成されるとリンクボタンを更新するものは何もありません。

itemrender が作成されると、たとえば 6 が生成され、データを更新すると、次のデータ セット用に既に作成されている 6 つの itemrender が使用されます (ただし、データは更新されます)。次のデータ セットに 8 つの itemRenderer が必要な場合、別の 2 つのレンダラーを作成するだけで済みます。そのため、まだ作成されていないため、これら 2 つの itemrender のみがセキュリティ関数を呼び出します。

于 2009-01-15T16:36:27.467 に答える