views:

34

answers:

1

I'm not sure if I'm misunderstanding the binding in Flex. I'm using Cairngorm framework. I have the following component with code like:

        [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>

in the model locator:

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

Inside the item renderer there is a button that calls a command and inside the command results there is a line like this:

model.friendsSearchResults = friendsSearchResults;

Putting break points and stepping through the code I confirmed that this like gets called and the friendsSearchResults gets updated.

To my understanding if I update a bindable variable it should automatically re-render the s:DataGroup which has a dataProvider of that variable.

+1  A: 

There's nothing obviously wrong in the code sample. It should work so I think there's a problem elsewhere.

I would recommend setting a breakpoint where the dataProvider is assigned and also where model.friendsSearchResults is assigned. Make sure they're both pointing to the same object instance. Then step through the property assignment and corresponding event.

To make debugging easier you can switch to using a named event instead of the default. With a named event, only event listeners interested in your particular property are triggered instead of any listeners listening for any property change. This is easier to debug and will run faster. For example, change:

[Bindable]
public var results:ArrayCollection;

to

[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"));
}

Another thing to keep in mind is that bindings hide certain errors like null reference exceptions. They assume the value simply isn't available yet and suppress the error. Stepping through the assignment and related bindings will help find a problem like this.

Sam
Thanks for the excellent insight, it helped detect the source of the problem I was doing something like: var friendsSearchResults:ArrayCollection = model.friendsSearchResults; but that was making the new variable just point to the same one so even if I did: model.friendsSearchResults = friendsSearchResults; afterward it didn't really set the model variable.
Tam