任何人都可以帮我这个吗?我不知道出了什么问题。
从json文件获取数据:
this.categoryTrees = new CategoryTrees();
this.categoryTrees.getCategoryTreesFromJSON();
this.categories = new Categories();
this.categories.getCategoriesFromJSON();
为它创建视图:
//view for startscreen
this.startscreenView = new StartscreenView({collection: this.categoryTrees});
//view for subjectsList
this.subjectsListView = new SubjectsListView({collection: this.categories.where({ category_tree : "onderwerpen" }) });
带有where子句的第二个给出了一个错误:Uncaught TypeError:Object [object Array]没有方法'on'
当我没有提出where子句时,它工作得很好。在控制台中,我能够毫无问题地执行where功能。
我在这里想念一下吗?
答案 0 :(得分:2)
where
method将在集合中返回与所传递属性匹配的所有模型的数组。因此它不会返回Backbone.Collection
,因此您会收到on
未定义的错误。
您需要根据Categories
的结果创建一个新的where
集合:
this.subjectsListView = new SubjectsListView({
collection: new Categories(
this.categories.where({ category_tree : "onderwerpen" }))
});
答案 1 :(得分:1)
找到合适的解决方案。在启动骨干应用程序之前,我在新函数loadDataAndStartApp()中检索JSON数据。当dom准备就绪时加载此函数,并且一旦加载JSON,它就会启动骨干应用程序。这样您就可以获得所有可用数据。再加上nemesv关于创建新类别功能的说法以及他回答的其他建议,我得出了以下这个问题的答案。
var AppRouter = Backbone.Router.extend({
routes: {
"": "startscreen",
"Onderwerpen": "subjectsList"
},
initialize: function (options) {
this.categories = new Categories( options.categories );
this.subjectsListView2 = new SubjectsListView({
collection: new Categories(
this.categories.where({ parent : null, name : "Evenwicht" })
)
});
//view for spacesList
},
startscreen: function () {
$('#app').html(this.startscreenView.render().el);
},
subjectsList: function () {
$('#app').append(this.subjectsListView2.render().el);
},
});
function loadDataAndStartApp(){
var categories = []
// LOAD APP DATA
$.ajax({
url : './catalogue.json',
dataType : 'json'
}).done(function(data){
console.log('Catalogue retrieved');
// GET CATEGORIES
_.each(data.categories, function( categorieObj ){
var categorieName = _.keys(categorieObj)[0],
categorieAttributes = categorieObj[categorieName];
categories.push( categorieAttributes );
});
// START APP
var app = new AppRouter({
categories : categories
});
Backbone.history.start();
});
}
$(function(){
// ON DOM READY
loadDataAndStartApp();
});