2012-10-24 77 views
0

我有问题同步从服务器接收的JSON数据与我的意见后提取。骨干意见不能与提取json

我没有“mainmodel”的集合,因为我只用一个“mainmodel”在时间,但众多“为MyModel”工作,无论如何,结构如下:

var mymodel = Backbone.Model.extend({ 
     defaults: {k1:"", 
        k2:"", 
        k3:""} 
    }); 

    var collection = Backbone.Collection.extend({model:mymodel,}); 

    var mainmodel = Backbone.Model.extend({ 
     defaults: {v1:"", 
        v2:"", 
        v3:"", 
        v4:new collection() 
    }); 

创建父视图中渲染函数的“mymodel”的嵌套视图。这只有在我使用新模型时才有效。

// My ParentView render function 
render: function() { 
for (var i = 0; i < this.model.v4.length;i++) { 
    var view = new MyModelView({model:this.model.v4.at(i)}); 
    this.$el.append($(view.render().el)); 
} 
this.$el.append(this.template(this.model.toJSON())); 
return this; 
}, 

// The MyModelView render function below 
render: function() { 
    this.$el.html(this.template(this.model.toJSON())); 
return this; 
}, 

现在,上述工程,如果我打开我的应用程序,并从那里创建模型。但是,如果我打开我的应用程序并提供一个id,我将对服务器进行读取,检索数据,然后创建一个新的ParentView,最终得到一个错误,指出“this.model.v4.at不是函数”。啊。

所以,现在,如果我改变第一渲染功能是,在(I)改变为[I]

var view = new MyModelView({model:this.model.v4[i]}); 

并更改第二渲染功能,删除的toJSON,是:

this.$el.html(this.template(this.model)); 

它呈现。但是我仍然无法绕过视图而没有错误。没有惊喜。我已经使用console.log(JSON.stringify(this.model));当他们到达parentView和MyModelView。返回的JSON看起来像这样,无论是获取还是创建。

{"v1":"val1", 
    "v2":"val2, 
    "v3":"val3", 
    "v4":[{"k1":"key1","k2":"key2","k3","key"}, { ... }, { ... }] 
    } 

JSON数据结构看起来是相同的。我认为JSON格式不正确,所以我在将模型交给视图之前尝试使用JSON.parse,但这并不起作用。也许我很兴奋,但我原本以为我有一个JSON格式问题,但现在我不知道。服务器将内容作为“application/json”返回。

编辑:v1,v2,v3的JSON值正确呈现。

任何想法?

回答

3

你有两个问题:一个你知道,一个你不知道。

您知道的问题是,您的mainmodel不会自动将您的v4 JSON转换为集合,因此最终会得到您期待集合的数组。

parse: function(response) { 
    if(response.v4) 
     response.v4 = new collection(response.v4); 
    return response; 
} 

的问题,你不知道的是,你在mainmodeldefaults有一个隐藏的参考共享问题:您定义

var mainmodel = Backbone.Model.extend({ 
    defaults: { 
     //... 
     v4: new collection() 
    } 
}); 

任何你可以通过添加parsemainmodel解决这个问题在Backbone.Model.extend对象中最终会出现在您模型的原型上,因此整个defaults对象将被模型的所有实例共享。另外,Backbone将在您的新模型中做一个defaults的浅拷贝。所以如果你m1 = new mainmodel()m2 = new mainmodel(),那么m1m2将具有完全相同的v4属性。您可以使用defaults的功能解决此问题:

var mainmodel = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      v1: '', 
      v2: '', 
      v3: '', 
      v4: new collection() 
     }; 
    } 
}); 
+0

就是这样!现在工作很好。谢谢! – fbynite

+0

很好的答案,谢谢! –