我正在处理一个应用程序,该应用程序要求通过筛选具有特定属性值的模型来生成集合的子集。我试图用模型方法进行过滤。这是收集代码(Questions.js):
define([
'underscore',
'backbone',
'models/Question',
'collections/Collection'
], function(_, Backbone, Question, Collection) {
return Collection.extend({
model: Question,
url: '/questions'
});
});
这里的模型简化为过滤方法(Question.js):
define([
'underscore',
'backbone',
'models/Model'
], function(_, Backbone, Model) {
return Model.extend({
categoryTextMatches: function(categoryText) {
var t = this.get('category').text;
console.info('t', t);
return (t === categoryText);
}
});
});
这是提取问题的应用代码:
this.questions.fetch({
data: this.set ? {set: this.set} : {},
success: _.bind(this.renderQuestions, this),
error: this.questions.parseError()
});
这里是renderQuestions中的代码,它试图抓住过滤后的问题子集:
var worryQuestions = new Questions().reset(this.questions.filter(this.getWorryQuestions));
这里是getWorryQuestions函数:
getWorryQuestions: function(model) {
return model.categoryTextMatches('Worry');
}
每当getCategoryTextMatches方法运行时,控制台输出会显示预期值(“悲伤'”,“忧虑&#39”等)。但是,还有来自Question.js中的模型代码的JavaScript错误:" this.get(...)未定义"。即使this.get('category').text
显示控制台中的预期输出,它也会引发错误。我真的不明白两者是如何同时发生的。任何帮助都会阻止我跳下桥,谢谢。
答案 0 :(得分:0)
我没有运行您的代码,但是如果您使用方法Array#filter
,则上下文会发生变化,因此categoryTextMatches
中的内容不是模型,而是this.question
类别。
在Model#constructor
中使用保护:
return Model.extend({
constructor: function () {
_.bindAll(this, 'categoryTextMatches');
}
});
答案 1 :(得分:0)
这需要大量的诊断,但问题源于这样一个事实,即代表三种不同类型问题的模型带有不同的属性集合 - 其中一些没有“类别”属性。我希望错误信息更明确,它只是告诉我.get()是未定义的,事实上并非如此。