【问题标题】:Having trouble with binding绑定有问题
【发布时间】:2011-02-02 06:41:44
【问题描述】:

我不确定我是否误解了 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;

设置断点并单步执行代码我确认调用了这个like 并且friendsSearchResults 得到了更新。

据我了解,如果我更新可绑定变量,它应该自动重新渲染具有该变量的 dataProvider 的 s:DataGroup。

【问题讨论】:

    标签: apache-flex data-binding cairngorm


    【解决方案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"));
    }
    

    要记住的另一件事是绑定会隐藏某些错误,例如空引用异常。他们假设该值根本不可用并抑制错误。逐步完成分配和相关的绑定将有助于发现这样的问题。

    【讨论】:

    • 感谢您的出色洞察力,它有助于检测我正在执行的问题的根源: var friendsSearchResults:ArrayCollection = model.friendsSearchResults;但这使得新变量只指向同一个变量,所以即使我这样做了:model.friendsSearchResults = friendsSearchResults;之后它并没有真正设置模型变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多