Javascript 为什么';获取函数';自动调用';解析函数';在backbone.js集合上?
我试图将json文件解析为主干集合和模型,如下所示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',
<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})
但我不建议这样做,我认为在获取之后发生的事情应该由调用获取的人来处理。但是没有什么能阻止你从技术上这么做。