1

我正在尝试使用以下填充选择。

 View: Backbone.View.extend({
                    initialize: function () {
                        this.setElement($('#templatePlaceholder'));
                    },
                    bindings: {

                        'select#List': {
                            observe: 'ddList',
                            selectOptions: {
                                collection: Q.when(getSelects.execute()).then(function (data) {
                                    console.dir(data);
                                    return data;
                                })

                            }
                        }
                    },

控制台返回一个数组对象:

 [ { value: 1, label: "a" },   { value: 2, label: "b" } ]

但我什么也得不到。

如果我将集合定义为:

collection: function () { return [{ value: 1, label: "a" },{ value: 2, label: "b" }];}

然后一切正常。

4

1 回答 1

1

这可能存在几个问题:异步代码View在分配时立即执行,这可能是不希望的;并且 collection 被分配给执行该承诺的结果,而不是return data.

一些解决方案:

1)您可以在页面加载时引导您的选择选项。这是单页或 Backbone 应用程序中的流行模式。基本上,您有后端将公共数据的 json 数据结构放在一起,然后将其作为 javascript 变量呈现到页面。所以服务器端模板(jsp、erb、php)看起来像这样:

<!DOCTYPE html>
...
    <script type="text/javascript">
       window.bootstrap = { users: <%= userjson %>, ddlist: <%= ddlistjson %> };
    </script>
...

建议使用此方法以提高性能和方便性。

2) 如果您可以选择getSelects.execute()同步运行 - 例如,如果它是一个 jQuery ajax 请求,请使用该async:false选项运行它 - 那么您可以在视图中的几个位置执行它。duringinitialize将在实际构造视图时获取数据。或者,您可以将collection绑定分配给运行 getSelects 例程的函数,该函数会阻塞然后返回数据:

collection: function() {
    var collection = [];
    // Assumes that getSelects.execute() will block and run synchronously.
    Q.when(getSelects.execute()).then(function (data) {
       collection = data;
    });
    return collection;
}

不推荐使用此方法,因为它可能会使您的 UI 处于时髦状态,因为它会阻止其他 javascript 运行,并且可能会挂断。

于 2013-04-19T18:36:55.633 回答