Ampersand.js模型或集合

时间:2015-07-08 20:06:57

标签: javascript backbone.js ampersand.js

在我目前的项目中,我正在使用ampersand.js模型和rest-collections。当我把它连接到api时,我遇到了麻烦。 api返回一个像这样的对象......

{ 
    type: ...,
    multi: ...,
    data: <good stuff>
}

为了将数据加载到模型或集合中,我理解我需要使用解析。

在浏览文档之后,似乎我应该在模型中进行解析。

实际上,当我对集合运行fetch时,它不会将数据加载到模型中,除非parse属性在集合上。但是,当我运行getOrFetch时,它将不会加载数据,除非parse属性在模型上。

如果我在模型和集合中都进行解析,那么无效。

我应该移动它真的没有意义。我需要知道它应该在哪里生活,以及我需要做些什么才能使它发挥作用。

以下是我的模特和收藏品:

var Case = Model.extend({
    ajaxConfig: function () {
        return {
            headers: {
                'x-auth-token': 'testing'
            }
        };
    },
    parse: function (response) {
        return response.data;
    },
    props: {
        id: 'string',
        orgId: 'string',
        created: 'string',
        lastUpdated: 'string',

    }
});

var CaseCollection = RestCollection.extend({
    model: Case,
    url: '/cases',
    ajaxConfig: function () {
        return {
            headers: {
                'x-auth-token': 'testing'
            }
        };
    },
    parse: function (response) {
        return response.data;
    },
    getCase: function (caseId, callbackfunc) {
        this.getOrFetch(caseId, function (err, model) {
            if (err) {
                console.log(err);
            } else {
                callbackfunc(model.toJSON());
            }
        });
    },
    getCases: function (callbackfunc) {
        this.fetch({
            success: function (collection, response) {
                callbackfunc(collection.toJSON());
            }
        });
    }
});

1 个答案:

答案 0 :(得分:0)

那么,这取决于资源的数据结构;

如果预期数据是一个对象数组,即客户端请求列表,则应覆盖该集合的parse。如果资源以对象响应,即客户请求单个,则您将覆盖模型的parse

根据您的情况 - 资源返回一个对象列表,因此覆盖集合parse以遍历响应数据并返回相关值。

如果响应数组中的对象与模型的结构匹配,则不应覆盖模型parse,以免干扰模型的构造。< / p>

&符号getOrFetch不应受此影响,因为它只缓存现有数据,或从预期资源中提取模型。

问题可能出在您的服务器(REST)API中。 Backbone通过将模型的url附加到URL作为另一个段来从集合的id中获取模型的资源,因此除非你的后端没有&#39; t在/cases/{id}处提供任何内容,与模板绑定的模型上的任何提取都将失败。

要解决此问题,请通过覆盖rootUrl更改模型的网址,或在后端创建此类资源。

来自model.url上的Backbone文档:

  

返回模型资源所在的相对URL   在服务器上。如果您的模型位于其他位置,请覆盖   这种方法具有正确的逻辑。生成表单的URL:   &#34; [collection.url] / [ID]&#34;默认情况下,您可以通过指定覆盖   如果不应该使用模型的集合,那么这是一个明确的urlRoot   帐户。