我不确定我是否误解了Flex中的绑定。我正在使用Cairngorm框架。我有以下组件,代码如下:
[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>
在模型定位器中:
[Bindable]
public var friendsSearchResults:ArrayCollection = new ArrayCollection();
在项目渲染器中有一个调用命令的按钮,在命令结果中有一行如下:
model.friendsSearchResults = friendsSearchResults;
提出断点并单步执行代码我确认调用了这个,并且更新了friendsSearchResults。
据我所知,如果我更新一个可绑定变量,它应该自动重新呈现s:DataGroup,它具有该变量的dataProvider。
答案 0 :(得分:1)
代码示例中没有明显错误。它应该工作所以我认为其他地方有问题。
我建议设置一个断点,分配dataProvider
以及分配model.friendsSearchResults
的位置。确保它们都指向同一个对象实例。然后逐步完成属性赋值和相应的事件。
为了使调试更容易,您可以切换到使用命名事件而不是默认事件。对于命名事件,仅触发对您的特定属性感兴趣的事件侦听器,而不是任何侦听任何属性更改的侦听器。这更容易调试,运行速度更快。例如,更改:
[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"));
}
要记住的另一件事是绑定会隐藏某些错误,例如null引用异常。他们认为该值尚不可用并且可以抑制错误。单步执行赋值和相关绑定将有助于找到这样的问题。