我有这个Backbone.Model
代表 Google Books API 卷:
var Book = Backbone.Model.extend({
defaults: {
volumeInfo : {
title: 'n.a.',
authors: 'n.a.',
publisher: 'n.a.',
publishedDate: 'n.a.',
imageLinks : {
smallThumbnail: '/unavailable.jpg'
}
}
},
parse: function(resp) {
if (resp.volumeInfo.authors) {
resp.volumeInfo.authors = resp.volumeInfo.authors.join(',');
}
return resp;
}
});
哪个被输入到这个模板:
<script type="text/template" id="bookCollectionRow">
<tr>
<td><img class="thumbnail" src="<%= volumeInfo.imageLinks.smallThumbnail %>" /></td>
<td><a target="_blank" href="<%= volumeInfo.canonicalVolumeLink %>"><%= volumeInfo.title %></a></td>
<td><%= volumeInfo.authors %></td>
<td><%= volumeInfo.publisher %></td>
<td><%= volumeInfo.publishedDate %></td>
</tr>
</script>
解析模板时,当卷 JSON 不包含imageLinks
我收到此错误:
Uncaught TypeError: Cannot read property 'smallThumbnail' of undefined.
我知道我可以通过检查来修复它if
in the Model
或在template
但目的是什么defaults
那么模型财产呢?仅当不覆盖时才有效parse
?
一些东西。首先,一般来说,您不应该将嵌套对象作为主干模型属性 - 如果您始终能够以原子方式处理该属性,那就没问题,但这是您无法做到这一点的完美示例。从数据模型的角度来看,imageLinks 应该是它的own主干模型类,volumeInfo 也应该如此。
其次,如果 defaults 是一个对象文字 ({}
)而不是函数,而是使用相同的对象作为每个模型实例的默认属性。我想你想要这个:
defaults: function(){
return {
volumeInfo : {} // should be new VolumeInfo({}) imo
};
},
但数据模型是更大的问题 - .defaults 并没有做你似乎想要的那种嵌套对象模板的事情,并且有充分的理由:它不能很好地工作,这只是第一个如果您不保持实例数据相当平坦,您将遇到许多问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)