Javascript 为什么';获取函数';自动调用';解析函数';在backbone.js集合上?

Javascript 为什么';获取函数';自动调用';解析函数';在backbone.js集合上?,javascript,jquery,json,backbone.js,backbone.js-collections,Javascript,Jquery,Json,Backbone.js,Backbone.js Collections,我试图将json文件解析为主干集合和模型,如下所示 <script> $(function() { var JSONModel = Backbone.Model.extend({}); var MyCollection = Backbone.Collection.extend({ model : JSONModel, url : 'profiles.json',

我试图将json文件解析为主干集合和模型,如下所示

    <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>
这是一个.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>

$(函数(){
var JSONModel=Backbone.Model.extend({});
var MyCollection=Backbone.Collection.extend({
型号:JSONModel,
url:'profiles.json',
初始化:函数(){
警报(“初始”);
},
解析:函数(响应){
对于(变量i=0;i


问题

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

2.是否有从fetch函数调用的其他函数

3.您认为如何修复此代码以获取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
方法,主干网将在更新模型和执行其他回调(在选项中传递)之前执行该方法,仅当您希望在进一步处理之前修改获取的数据(更新模型/集合、传递给回调等)时才需要该方法

例如,假设您的
.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"
 }]
}
然后,您需要解析它并返回实际数组,如下所示:

parse: function(response){
  console.log(response.someKey); // do somethig with this if required
  return response.data;
}
在您的例子中,
.json
包含一个对象数组,主干将把数组中的每个对象解析为指定类型的模型,并将其添加到集合中。无需指定
parse
方法


是的,还有其他内部调用的方法,例如
sync
toJSON
等。它们每个都有自己的职责(并且可以被覆盖),这在中给出。

请查看我下面的评论,了解您的问题:

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

Ans:在扩展
主干时。集合
您已经覆盖了
解析
回调函数,
主干
在我们尝试
获取
集合时,内部调用
解析
函数。这是标准电话。我认为你不必也不可能改变这种行为

2。是否有从fetch函数调用的其他函数

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

3。您认为如何修复此代码以获取json对象?我无法获取此代码中的“collection.length”

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

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

非常感谢你。第二个问题有点模棱两可,对不起。正如您所说的,fetch调用在内部解析。我的意思是“还有其他函数像parse一样,是从fetch函数调用的。”非常感谢。因为你,我完全理解这个问题!太有用了!!我可以在MyCollection中添加success函数吗,tough?@JinnySong技术上你可以做
collection.fetch({success:collection.successHandler})
但我不建议这样做,我认为在获取之后发生的事情应该由调用
获取的人来处理。但是没有什么能阻止你从技术上这么做。