【问题标题】:How do I bootstrap a collection in Backbone.js using Javascript only如何仅使用 Javascript 在 Backbone.js 中引导集合
【发布时间】:2012-06-17 17:07:43
【问题描述】:

上下文:我正在构建一个需要多个大型参考数据集合才能运行的应用程序。我仅限于 HTML 和 Javascript(包括 JSON)。

问题:我如何在 Backbone.js 中引导一个集合,其中集合对象在服务器上是 JSON 格式并且我只使用 Javascript?

这是我已经知道的:

  • Backbone.js 引导最佳实践需要 Rails 或其他一些服务器端语言 (http://backbonejs.org/#FAQ-bootstrap)。
  • 大多数 Javascript I/0 操作都是异步的,例如从服务器加载 JSON。
  • 使用 fetch() 引导数据在 Backbone.js 中被认为是一种反模式。 fetch() 也是一个异步操作。

这是我目前想出的:

ItemList = Backbone.Collection.extend({
  model: Item,
  url: 'http://localhost:8080/json/items.json'
});
var itemList = new ItemList;
itemList.fetch();
itemList.on('reset', function () { dqApp.trigger('itemList:reset'); });

'dqApp' 是我的应用程序对象。我可以显示一个微调器,并在填充集合时通过向应用程序对象发送警报来更新加载状态。

【问题讨论】:

    标签: javascript backbone.js backbone.js-collections


    【解决方案1】:

    一种可能的解决方案是让您的视图依赖于fetch 的状态,因此在您的模型/集合完成加载之前它不会被实例化。

    请记住,这是一个 Backbone 反模式。使视图依赖于您的集合/模型可能会导致 UI 延迟。这就是为什么推荐的方法是通过直接在页面中内联 json 来引导数据。

    但这并不能解决您的情况,您需要在 无服务器 情况下引导数据。使用几行 Ruby/PHP/etc 将 json 数据动态嵌入页面很容易,但如果您只在 client-side 工作,则使视图依赖于模型是一种方法去吧。

    如果您使用 fetch() 加载集合,您可以使用类似:

    var Model = Backbone.Model.extend({});
    
    var Collection = Backbone.Collection.extend({
        model: MyModel,
        url: 'http://localhost:8080/json/items.json'
    });
    
    var View = Backbone.View.extend({
        //code
    });
    
    var myCollection = new Collection();
    
    myCollection.fetch({
        success: function () { 
            console.log('Model finished loading'); }
            myView = new View();
      });
    

    我的首选方法是使用 ajax(例如,.getJSON.ajax)并将返回的 jqXHR 对象(或 XMLHTTPRequest,如果您不使用 jQuery)保存到模型中的属性中。这样您就可以进行更精细的控制,并且可以在创建视图之前使用deferred object 响应来检查调用状态。

    var Model = Backbone.Model.extend({});
    
    var Collection = Backbone.Collection.extend({
        model: Model,
        status: {},
        initialize: function () {
            var _thisCollection = this;
            this.status = $.getJSON("mydata.json", function (data) {
                $.each(data, function(key) {
                    var m = new Model ( {
                            "name": data[key].name,
                            "value": data[key].value,
                        } );
                    _thisCollection.add(m);
                });
            });
        }
    });
    
    var View = Backbone.View.extend({
        console.log( "Creating view...");
        //code
    });
    
    var myCollection = new Collection();
    var myView = {};
    myCollection.status
        .done(function(){
            console.log("Collection successfully loaded. Creating the view");
            myView = new View();
        })
        .fail(function(){
            console.log("Error bootstrapping model");
        });
    

    【讨论】:

      【解决方案2】:

      fetch function 接受一个选项参数,该参数可以有一个success 回调:

      var itemList = new ItemList;
      itemList.fetch({success: function () {
          dqApp.trigger('itemList:reset');
      }});
      

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 这不能回答问题。 Mr The Falcon 正在寻找从服务器加载集合的内容,而不是从脚本/HTML 文件中嵌入的数据。
        • 这就是引导,从嵌入式数据中加载集合,而使用 fetch()。
        • 我还是一头雾水。您首先从哪里获取这些数据以便将其嵌入到脚本/HTML 中?您不必对数据库服务器进行 REST-ful 调用吗?
        猜你喜欢
        • 1970-01-01
        • 2011-12-19
        • 2012-05-10
        • 1970-01-01
        • 2011-11-20
        • 2011-08-31
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多