1

を使用してのFlex 4とパセリの依存性の注入の問題は、私はビュークラスにEmployeeListを持っている:次のようにプレゼンテーションモデルパターン

<?xml version="1.0" encoding="utf-8"?> 
<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:parsley="http://www.spicefactory.org/parsley" 
        xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300"> 


    <fx:Script> 
     <![CDATA[ 
      import cafeparsley.model.EmployeeListPM; 

      [Inject] 
      [Bindable] 
      public var model : EmployeeListPM; 

      [Init] 
      public function init() : void { 
       model.init(); 
      } 


     ]]> 
    </fx:Script>  

    <s:Panel title="Employee List" horizontalCenter="0"> 
     <s:HGroup paddingTop="50"> 
      <s:Button label="Add New Employee" click="model.addNewEmployee()" /> 
      <mx:Spacer width="100%" /> 
      <s:Button label="Logout" click="model.logout()" /> 
      <mx:Spacer width="100%" height="20" /> 
     </s:HGroup> 
     <s:List id="empList" dataProvider="{ model.employees }" labelFunction="model.properName" 
       change="model.initUpdateEmployee(empList.selectedItem);empList.selectedIndex = -1;" width="100%" /> 
     <s:Label id="error" color="0xFF0000" /> 
    </s:Panel> 

</s:NavigatorContent> 

PMは、次のようになります。

package cafeparsley.model 
{ 
    import cafeparsley.events.EmployeeEvent; 
    import cafeparsley.events.NavigationEvent; 
    import cafeparsley.services.impl.EmployeeServiceImpl; 
    import cafeparsley.vo.Employee; 

    import flash.events.EventDispatcher; 

    import mx.collections.ArrayCollection; 
    import mx.rpc.IResponder; 

    [Bindable] 
    [Event(name="navigationEvent", type="cafeparsley.events.NavigationEvent")] 
    [ManagedEvents("navigationEvent")] 
    public class EmployeeListPM extends EventDispatcher implements IResponder 
    { 

     public var employeeService : EmployeeServiceImpl = new EmployeeServiceImpl(); 

     public var employees : ArrayCollection; 

     public function init() : void 
     { 
      loadEmployees(); 
     } 


     public function EmployeeListPM() 
     { 
     } 

     public function loadEmployees():void 
     { 
      employeeService.loadEmployees(this); 
     } 
かかわらず、私が使用しているかどうかの

またはオートワイヤリング注入を実行するには、次のエラーメッセージが表示されます。

TypeError:Error#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません。 at cafeparsley.view :: EmployeeList/_EmployeeList_List1_i()[c:\ dev \ code \ workspace \ Examples \ CafeParsley \ src \ cafeparsley \ view \ EmployeeList.mxml:29] cafeparsley.view :: EmployeeList/_EmployeeList_Array2_c() at mx.core :: DeferredInstanceFromFunction/getInstance()[E:\ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ core \ DeferredInstanceFromFunction.as:105] at spark.components :: SkinnableContainer/createDeferredContent SkinnableContainer/createContentIfNeeded()[E:\ dev \ 4]にある、[E:¥dev¥4.x¥frameworks¥projects¥spark¥src¥spark¥components¥SkinnableContainer.as:985】 です。 (E):¥dev¥4.x¥frameworks¥projects¥spark¥src¥spark¥src¥spark¥components¥SkinnableContainer.as:1014】 spark.components :: SkinnableContainer/createChildren() spark \ components \ SkinnableContainer.as:827] at mx.core :: UIComponent/initialize()[E:\ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as:7349] at mx.core :: UIComponent/http ://www.adobe.com/2006/flex/mx/internal :: childAdded()[E:\ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as:7241] mx.core :: UIComponent/addChildAt()[E:\ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as:6947] at spark.components :: Group/addDisplayObjectToDisplayList )[E:\ dev \ 4.x \ frameworks \ projects \ spark \ src \ spark \ components \ Group.as:1825] at spark.components :: Group/http://www.adobe.com/2006/ Spark.components :: Group/setMXMLContent()でflex/mx/internal :: elementAdded()[E:\ dev \ 4.x \ frameworks \ projects \ spark \ src \ spark \ components \ Group.as:1416] [E:\ dev \ 4.x \ frameworks \ projects \ spark \ src \ spark \ components \ Group.as:512] spark.components :: Group/set mxmlContent()[E:\ dev \ 4.x \ frameworks \ projects \ spark \ src \ spark \ components \ Group.as:452] at spark.components :: SkinnableContainer/set SkinnableContainer/createDeferredContent()[E:\ dev \ 4]のmxmlContent()[E:\ dev \ 4.x \ frameworks \ projects \ spark \ src \ spark \ components \ SkinnableContainer.as:604] .x \ frameworks \ projects \ spark \ src \ spark \ components \ SkinnableContainer.as:986] at spark.components :: SkinnableContainer/createContentIfNeeded()[E:\ dev \ 4.x \ frameworks \ projects \ spark \ src \ spark \ components \ SkinnableContainer.as:1014] at spark.components :: SkinnableContainer/createChildren()[E:\ dev \ 4.x \フレームワーク\ projects \ spark \ src \ spark \ components \ SkinnableContainer.as:827 ] at spark.components :: NavigatorContent/createChildren()[E:\ dev \ 4.x \ frameworks \ projects \ spark \ src \ spark \ components \ NavigatorContent.as :225] mx.core :: UIComponent/initialize()[E:\ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as:7349] at cafeparsley.view :: EmployeeList/initialize()

したがって、エラーがスローされるとemployeeListPMはnullになります。しかし、 <s:List>コンポーネントをコメントアウトして、initメソッドでブレークポイントを再実行して設定すると、init()が呼び出されます。だから、私のコンテキスト設定が間違っているというわけではありません。PMが時間内に注入されておらず、エラーがスローされただけです。しかし、私はautowiringまたは<parsley:configure/>を使用する場合、パースレーのマニュアルによると、PMは必要な時に注入する必要があります。

私は、私が考えていたものが、比較的単純な依存性注入シナリオであるとは思えません。手伝ってくれますか?

答えて

1

ここでのポイントのカップル:

あなたの例では、あなたがあなたの記事でそれらを言及しかし、以来、私は、彼らはただのサンプルコードから欠落していると仮定します、<Configure />または<FastInject />タグが含まれていません。 (そうでない場合は、これを動作させるためにこれらの1つを追加する必要があります)。

しかし、おそらく、あなたのコードに競合条件があります。

は具体的には、これらの行:

labelFunction="model.properName" 
change="model.initUpdateEmployee(empList.selectedItem);empList.selectedIndex = -1;" 

Modelが注入されたプロパティですが、しかしコードが最初に実行された時点で注入されたことが保証はありません。

代わりに、ヌルチェックを実行するクラス内のスクリプトにコードを移動してから、論理をPMに戻します。

すなわち:

labelFunction="nameFunction" 


private function nameFunction(item:Object):String 
{ 
    return (model) ? model.properName(item) : ""; 
} 
0

もう1つ考えるべきことは、あなたはパセリ[INIT]メタタグでマークされたビューの機能からmodel.init()を呼び出しているということです。私は同じ[Init]メタタグをモデルのinit()メソッドに適用することをお勧めします。

[Init]  
public function loadEmployees():void { 
    employeeService.loadEmployees(this); 
} 

ビューからmodel.init()を呼び出すのではなく、これを行います。ライフサイクルドキュメントは述べてAltho:

The methods marked with [Init] get invoked after the object has been instantiated and all injections have been processed.

私はどんなのinit()を直接ではなく、メタデータタグのアプローチを利用注射し、オブジェクト間のメソッド呼び出していないはるかに一貫性のある結果を持っていました。