Javascript 一个集合主干中的不同模型类型

Javascript 一个集合主干中的不同模型类型,javascript,backbone.js,backbone.js-collections,backbone-model,Javascript,Backbone.js,Backbone.js Collections,Backbone Model,主干1.1.2 下划线1.7.0 jQuery 1.11.1 我有一个保存消息的集合。 我的消息可以是不同的类型,api中的端点对于每种类型都不同,但是我有一个端点,它允许我执行一个请求并获取所有消息 当Collection.fetch 我需要能够定义在基于现有属性填充集合时要使用的模型 我已经按照这里的建议进行了尝试: 以及主干文档 我的代码如下所示 model: function (attr, options) { if(attr.hasOwnProperty('prop')){

主干1.1.2 下划线1.7.0 jQuery 1.11.1

我有一个保存消息的集合。 我的消息可以是不同的类型,api中的端点对于每种类型都不同,但是我有一个端点,它允许我执行一个请求并获取所有消息

当Collection.fetch 我需要能够定义在基于现有属性填充集合时要使用的模型

我已经按照这里的建议进行了尝试: 以及主干文档

我的代码如下所示

model: function (attr, options) {
    if(attr.hasOwnProperty('prop')){
        return new PropModel(attr,options);
    }
    else if(attr.hasOwnProperty('another_prop')){
        new AnotherPropModel(attr,options);
    }
},
attr值只是一个大的对象数组,因此如果不进行遍历,这个解决方案对我来说毫无意义,它显然不起作用

我处理得对吗?还有别的方法吗

--更新--

我也尝试过在集合的Parse函数中这样做,但我的集合是空的

parse: function (resp, options) {
    _.each(resp, _.bind(function (r) {
        console.log(this);
        if(r.hasOwnProperty('prop')){
            this.add(new PropModel(r));
        }else{
            this.add(new AnotherPropModel(r));
        }
    },this));
}

您可以执行以下操作—如果可能,对不同的类型作出反应,然后提供不同的URL。一旦JSON模型在模板中,您就可以按照自己喜欢的方式呈现HTML:

示例Json

示例模型

收藏

看法

**!!更新**

如果您仍然想使用parse,可以查看以下内容

parse: function (data, options) {

    var models = [];
    _.each(data, function (entity) {
        // this is IE8 Safe....
        var model = Object.prototype.hasOwnProperty.call(entity,'prop') ? PropModel : AnotherPropModel;
        models.push(new model(entity));    
    });

    return models;
}

因此,解决方案是混合使用模型函数和返回

解释如下:

首先是parse函数 这只是我们改变从服务器收到的响应的入口点

parse: function (resp, options) {
    return resp;
}
在我的例子中,服务器返回的对象为Object

{{1:data},{2:data}}
首先,这很奇怪,显然需要解决。 重要的一点是: 当主干网评估解析返回的响应时,它需要决定每个模型的中断位置,就像定义新模型一样

主干将对象视为一个单一模型,在我的例子中,我有一个大对象,我得到了一个大模型。。。这就是为什么模型函数中的attrs参数是大量数据的原因

所以我简单地修改了解析函数中的响应,瞧!!模型功能中的所有功能均按预期工作:

代码如下:

model: function (attr, options) {
    if(attr.hasOwnProperty('prop')){
        return new PropModel(attr,options);
    }
    else if (attr.hasOwnProperty('anotherProp')){
        return new AnotherPropModel(attr,options);
    }
},

parse: function (resp, options) {
    var response = [];
    _.each(resp, _.bind(function (r) {
        response.push(r);
    },this));
    return response;
}
我确信有更好的方法将对象解析为数组,但就目前而言,这是可行的,我再次微笑

本文将引导我找到解决方案:

各型号之间是否存在关键差异?或者只是URL?@anAgent每个模型的属性都不同,因此我希望在呈现模板时按模型进行类型转换。我想我可以在模板中执行相同的逻辑,但我更喜欢将逻辑排除在模板之外,这样我可以在需要时轻松切换模板引擎。此外,url对我很重要,因为属性不同。即使消息可以分组,它们在my Systems的其他区域中也是独立的看起来您走的是正确的路径-根据需要更改集合的获取url,然后在该函数中,您应该只需要返回未更新的模型函数-如果attr.modelType=='mailitm'{return mailitemodel;}@在属性中,我没有模型类型。我有一个从Json解析的数组对象。我知道这将如何解析多个url端点,但我仍然不明白这如何为我定义模型,以便我可以进行类型转换?它回答了类型转换的要求-因此我同意它不能满足您的确切问题。我认为如果你开始使用类型转换,你将开始遇到其他长期问题,也更难测试。事实上,我是一个类型转换的爱好者,因为这会迫使理解,并允许快速失败。你的更新很有意义,我忘了提到我正在开发一个chrome扩展。。。所以现在不要太担心跨浏览器兼容性。只是一条注释,您不需要使用u.bind,因为u.each的第三个参数是上下文。第二,你没有调用任何超出u范围的东西,因此不需要。你是对的!!我已经删除了u.bind,我想我只是养成了丢失作用域的习惯,所以我倾向于将回调函数绑定为习惯。
parse: function (data, options) {

    var models = [];
    _.each(data, function (entity) {
        // this is IE8 Safe....
        var model = Object.prototype.hasOwnProperty.call(entity,'prop') ? PropModel : AnotherPropModel;
        models.push(new model(entity));    
    });

    return models;
}
parse: function (resp, options) {
    return resp;
}
{{1:data},{2:data}}
model: function (attr, options) {
    if(attr.hasOwnProperty('prop')){
        return new PropModel(attr,options);
    }
    else if (attr.hasOwnProperty('anotherProp')){
        return new AnotherPropModel(attr,options);
    }
},

parse: function (resp, options) {
    var response = [];
    _.each(resp, _.bind(function (r) {
        response.push(r);
    },this));
    return response;
}