Backbone model.get()在模型方法中是未定义的

时间:2014-07-11 21:25:44

标签: javascript backbone.js

我正在处理一个应用程序,该应用程序要求通过筛选具有特定属性值的模型来生成集合的子集。我试图用模型方法进行过滤。这是收集代码(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显示控制台中的预期输出,它也会引发错误。我真的不明白两者是如何同时发生的。任何帮助都会阻止我跳下桥,谢谢。

2 个答案:

答案 0 :(得分:0)

我没有运行您的代码,但是如果您使用方法Array#filter,则上下文会发生变化,因此categoryTextMatches中的内容不是模型,而是this.question类别。

Model#constructor中使用保护:

return Model.extend({
    constructor: function () {
        _.bindAll(this, 'categoryTextMatches');
    }
});

答案 1 :(得分:0)

这需要大量的诊断,但问题源于这样一个事实,即代表三种不同类型问题的模型带有不同的属性集合 - 其中一些没有“类别”属性。我希望错误信息更明确,它只是告诉我.get()是未定义的,事实上并非如此。