2010-03-30 6 views
0

Je ne suis pas sûr d'avoir mal compris la liaison dans Flex. J'utilise le framework Cairngorm. Je le composant suivant avec le code suivant:Problèmes de liaison

 [Bindable] 
     var _model:LalModelLocator = LalModelLocator.getInstance(); 
.... 
<s:DataGroup dataProvider="{_model.friendsSearchResults}" 
        includeIn="find" 
        itemRenderer="com.lal.renderers.SingleFriendDisplayRenderer"> 
      <s:layout> 
       <s:TileLayout orientation="columns" requestedColumnCount="2" /> 
      </s:layout>   </s:DataGroup> 

dans le localisateur de modèle:

[Bindable] 
public var friendsSearchResults:ArrayCollection = new ArrayCollection(); 

A l'intérieur du rendu d'élément il y a un bouton qui appelle une commande et à l'intérieur des résultats de la commande il y a une ligne comme ceci:

model.friendsSearchResults = friendsSearchResults; 

Putting points de rupture et parcourant le code, je confirme que cela comme est appelé et les friendsSearchResults est mis à jour. À mon avis, si je mets à jour une variable pouvant être liée, elle devrait automatiquement rendre de nouveau le s: DataGroup qui a un dataProvider de cette variable.

Répondre

1

Il n'y a rien de manifestement faux dans l'exemple de code. Cela devrait fonctionner, donc je pense qu'il y a un problème ailleurs.

Je recommande de définir un point d'arrêt où le dataProvider est affecté et où model.friendsSearchResults est affecté. Assurez-vous qu'ils pointent tous les deux vers la même instance d'objet. Parcourez ensuite l'affectation de propriété et l'événement correspondant.

Pour faciliter le débogage, vous pouvez utiliser un événement nommé au lieu de celui par défaut. Avec un événement nommé, seuls les écouteurs d'événements intéressés par votre propriété particulière sont déclenchés à la place de tous les écouteurs à l'écoute de tout changement de propriété. Ceci est plus facile à déboguer et fonctionnera plus vite. Par exemple, changer:

[Bindable] 
public var results:ArrayCollection; 

à

[Bindable("resultsChanged")] 
private var _results:ArrayCollection; 
public function get results():ArrayCollection { 
    return _results; 
} 
public function set results(value:ArrayCollection):Void { 
    _results = value; 
    dispatchEvent(new Event("resultsChanged")); 
} 

Une autre chose à garder à l'esprit est que les liaisons cachent certaines erreurs comme des exceptions de référence nulles. Ils supposent que la valeur n'est tout simplement pas encore disponible et suppriment l'erreur. Passer à travers l'assignation et les liaisons associées aidera à trouver un problème comme celui-ci.

+0

Merci pour l'excellent aperçu, il a aidé à détecter la source du problème que je faisais quelque chose comme: var friendsSearchResults: ArrayCollection = model.friendsSearchResults; mais cela faisait que la nouvelle variable pointait vers le même, donc même si je le faisais: model.friendsSearchResults = friendsSearchResults; par la suite, il n'a pas vraiment défini la variable du modèle. – Tam

Questions connexes