【问题标题】:Clean way to specialize (differentiate) the behaviour of Backbone.Model parse method专门化(区分)Backbone.Model 解析方法的行为的干净方法
【发布时间】:2014-01-08 14:11:32
【问题描述】:

我有一个名为BaseModel 的简单模型,它从Backbone.Model 扩展而来。根据Backbone.js 文档,我已经覆盖parse 方法以使用预先存在的API。

parse 方法在两种不同的情况下被调用。当我想从集合中获取所有数据时。当我想从模型中获取特定数据时。

BaseModel 内区分我正在执行以下操作的行为。

parse : function(response, options) {
    var result;        

    if(options.collection) {
        // I'm coming from the fetch that belongs to the collection

        // manipulate result here...
    } else {
        // I'm coming from the fetch that belongs to the model

        // manipulate result here...
    }
    return result;
}

这种方法有效还是有更好的方法来实现这一点?

编辑 1

我想到了 Andrew 的回答,但我需要处理的情况很奇怪。事实上,当第一次(来自集合)调用parse 方法时,会解析数据并创建模型的属性。然后,当从模型本身调用 parse 方法时,会解析其他数据并将模型的属性合并到第一个数据中。

编辑 2

例如,在我的情况下,来自集合的响应包含一个对象数组,其中每个对象都有一个属性a。可以应用转换,例如日期对象。然后,来自模型的响应包含b。也可以在这里应用转换。最后,这两个属性将合并到同一个模型中,但它们来自不同的fetch 调用。

请注意,集合中的响应已经是一个数组。所以,我在这里不区分或分裂任何东西。我只知道如果我来自收藏,我会找到a,否则我会找到b

将集合中的fetch 读取为给我所有模型,而另一个调用为基于从集合返回的模型,通过细节丰富它

【问题讨论】:

    标签: javascript backbone.js collections


    【解决方案1】:

    Backbone.Collection 也有一个parse 方法。我认为正确的方法是为您的BaseModel 和您的Collection 实施它。

    集合解析方法只需要将数据转换为未解析模型的数组即可。然后它会自动委托给BaseModel parse 方法来单独解析每一个。

    例如,

    BaseModel {
    parse : function(response, options) {
        var result;               
        // I'm coming from the fetch that belongs to the model
    
        // manipulate result here...
    
        return result;
    }
    }
    
    BaseCollection {
    parse : function(response, options){
        // I'm coming from the fetch that belongs to the collection
        // Turn it into an array.
        return response.split('mydelim');
    }
    }
    

    从您的编辑 2 看来,您的方法似乎是正确的想法。但是我会说,如果我在哪里做,我会测试返回的对象的属性而不是调用的上下文,所以我不需要关心数据源,

    parse : function(response, options) {
        var result = {};        
    
        if(response.a){
            result.c = response.a;
        } else if(response.b){
            result.c = response.b;
        }
    
        ...
    
        return result;
    }
    

    【讨论】:

    • 感谢您的回复。 +1。我同意你的看法。但是把它变成一个数组是什么意思呢?另请参阅我的编辑。
    • @flexaddicted 默认情况下,从数据源更新时,集合需要一个对象数组作为返回。因此,您需要获取从数据源返回的任何内容并将其转换为对象数组。在我的示例中,我只是将其拆分,因此 andrewmydelimbob 将变为 ['andrew', 'bob'],然后您的模型解析可以将其转换为 {name : 'andrew'} 等。
    • 那么在收集的情况下,我应该创建对象数组(以正确的方式解析)为返回的每个项目进行推送吗?你在说这个吗?谢谢。
    • @flexaddicted 您不需要自己解析对象。集合将在内部创建一个模型,调用模型的 parse 方法来填充它。您只需要返回一组值,然后您的基础模型可以解析这些值。如果您发布响应字符串的示例,我可以更好地解释。
    • 如果可能,请参阅编辑 2。我已经解释了我想要实现的目标。感谢您的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多