【问题标题】:Backbone & working with non-JSON data主干和使用非 JSON 数据
【发布时间】:2014-05-18 12:56:26
【问题描述】:

我有一个静态文件,每行只有一个日期时间,例如:

2014-03-14T16:32
2014-03-15T13:04
2014-03-16T06:44
...

我想将其用作主干集合的只读数据源。显然这不是预期的格式。我想我可以在我的集合上使用 parse 方法将其转换为适当的对象数组。不幸的是,这似乎不起作用。

首先,如果我不重写 fetch,则永远不会调用 parse 方法——它会进入错误处理程序,尽管具体原因不明——它实际上并没有抛出任何错误。我猜那是因为它期待不同的响应类型或其他什么?

其次,如果我这样重写 fetch 和 parse 方法:

var MyColl = Backbone.Collection.extend({
    model: MyModel,
    url: 'date-list.txt',
    parse: function(data) {
        var result = _(data.split("\n")).compact().map(function(item, i) { 
            return { theDate: item, globalIndex: i };
        });
        return result;
    },
    fetch: function() {
        $.get(this.url, this.parse);
    }
});

它正确地进入了解析,并且解析似乎构建了一个有效的对象,但是我的集合在整个操作之后有 0 个模型......

我想集合是空的,因为当我调用 parse 时,它​​不再是预期流程的一部分,因此对结果没有任何处理。关于如何正确处理服务器返回的内容的任何其他想法?

显然,我可以让服务器返回 JSON,或者我可以在骨干网之外使用自己的获取函数,但我希望有办法避免这些想法。

【问题讨论】:

    标签: javascript ajax backbone.js


    【解决方案1】:

    我相信默认的 fetch 方法假定您将从端点返回 JSON,然后集合将从 JSON 数据中为数组中的每个对象实例化一个新模型。

    使用您当前的覆盖,您只需要在您的 parse 方法中构建一个 Backbone 模型数组:

    parse: function(data) {
      var model = this.model;
      var result = _(data.split("\n")).compact().map(function(item, i) { 
        return new model({ theDate: item, globalIndex: i });
      });
    
      return result;
    },
    

    【讨论】:

    • 这就是我正在做的。除非我覆盖 fetch,否则永远不会调用 parse 方法。它进入错误处理程序,但不清楚原因。 (我可能应该在描述中更清楚地说明这一点。)
    • 哦,我只是想说我认为您必须遵循第二种方法来覆盖 fetch 和 parse,因为 fetch 需要 JSON。您只需对返回 new model({ theDate: item, globalIndex: i })(见上文)的当前代码进行轻微修改,以便正确填充集合。
    • 很奇怪。我可以发誓过去在Collection.fetch() 中我返回了一个对象数组,而不是模型数组。不过,这似乎可行,谢谢。
    • 再想一想,这仍然行不通。 IE。 c = 新的 MyColl(); c.fetch(); console.log(c.length) => 0;
    【解决方案2】:

    您似乎没有将正确的函数传递给$.get,或者更准确地说,是正确的函数但未绑定到特定的对象实例。一个想法是试试这个:

    $.get(this.url, _.bind(this.parse, this));
    

    但是现在,正如你所说,parse 方法的结果没有做任何事情,所以你可以像这样将元素添加到集合中:

    parse: function(data) {
        var result = _(data.split("\n")).compact().map(function(item, i) { 
            return { theDate: item, globalIndex: i };
        });
        this.set(result);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多