为什么 'fetch function' 自动调用 backbone.js 集合上的 'parse function'?

Why the 'fetch function' automatically call the 'parse function' on backbone.js collection?

我正在尝试将我的 json 文件解析为 Backbone 集合和模型,如下所示。

这是 .json 文件

[
{
    "type": "rect",
    "x": 10,
    "y": 10,
    "w": 100,
    "h": 100,
    "color": "red"
},
{
    "type": "arc",
    "x": 210,
    "y": 20,
    "w": 200,
    "h": 150,
    "color": "blue"
}
]

我也有 .html 文件,如下所示。

    <script>
    $(function() {
        var JSONModel = Backbone.Model.extend({});

        var MyCollection = Backbone.Collection.extend({
            model : JSONModel,
            url : 'profiles.json',
            initialize : function() {
                alert("init");
            },
            parse : function(response) {

                for (var i = 0; i < response.length; i++) {
                    var tmpModel = new JSONModel();
                    tmpModel.set({
                        type : response[i].type,
                        x : response[i].x,
                        y : response[i].y,
                        w : response[i].w,
                        h : response[i].h,
                        color : response[i].color
                    });
                    this.add(tmpModel);
                    alert("inserting" + i);
                }

                return response;
            }

        });

        var collection = new MyCollection();
        collection.fetch();
        alert(collection.length);


    });
</script>


Q.

1.In这段代码,fetch函数为什么调用parse函数?

2.Is 还有其他从 fetch 函数调用的函数吗?

3.Do 你认为我该如何修改这段代码来获取 json 对象?我无法在此代码中获取 'collection.length'。

请帮忙。

您没有获得预期长度的原因是 fetch() 是异步的。一旦承诺得到解决(提取完成),您需要检查长度。

您需要做的就是:

var MyCollection = Backbone.Collection.extend({
  model: JSONModel,
  url: 'profiles.json',
  initialize: function() {
    console.log("init");
  }
});

var collection = new MyCollection();
collection.fetch({
  success: function(collection, response) {
    console.log(collection.length);
  }
});

如果你定义了一个parse方法,backbone将在更新模型和执行其他回调(在选项中传递)之前执行它,这仅当您想在进一步处理之前修改获取的数据时才需要(更新 model/collection、传递给回调等)。

例如,假设您的 .json 包含以下内容:

{
 "someKey": "some Info",
 "data": [{
  "type": "rect",
  "x": 10,
  "y": 10,
  "w": 100,
  "h": 100,
  "color": "red"
 },
 {
  "type": "arc",
  "x": 210,
  "y": 20,
  "w": 200,
  "h": 150,
  "color": "blue"
 }]
}

然后你想解析这个和 return 实际数组,如:

parse: function(response){
  console.log(response.someKey); // do somethig with this if required
  return response.data;
}

在您的例子中,.json 包含一个对象数组,backbone 会将数组中的每个对象解析为指定类型的模型并将其添加到您的集合中。无需指定 parse 方法。

是的,还有其他内部调用的方法,例如 synctoJSON 等。每个方法都有自己的职责(并且可以被覆盖) 在 documentation.

中给出

请看下面我对你的问题的评论:

1。在这段代码中,为什么fetch函数调用parse函数?

回答: 在扩展 Backbone.Collection 时你覆盖了 parse 回调函数并且 Backbone 内部调用了 parse 函数每当我们尝试 fetch 集合时。这是标准调用。我不认为你必须或可以改变这种行为。

2。 fetch 函数有没有调用其他函数?

回答: 据我所知,我认为调用 fetch 时不会调用任何其他回调函数。你为什么要找它?您对这一点的要求是什么?有什么具体原因吗?

3。您认为我该如何修复此代码以获取 json 对象?我无法在这段代码中得到 'collection.length'。

答案:您必须等到我们收到数据的时候,因此我们需要按以下方式添加success处理程序:

collection.fetch({
  success: function(collection){
    // Callback triggered only after receiving the data.
    console.log(collection.length); 
  }
});