ember.js .find()仅在第二次调用时才有效

时间:2013-06-15 02:06:39

标签: javascript ember.js

主要目标:使用.find()访问当前控制器中可用模型以外的模型 - 以便将当前控制器模型中的数据与来自a的数据进行比较'外国'控制器的模型。

触发比较的原因是什么: 我在{{ action "isResponse"}}模板中有一个按钮。此模板的控制器具有isResponse : function() {...}

我遇到的问题:每次点击按钮都会触发操作,但App.Answer.find()仅在第二次点击后返回内容。 我想知道这是因为Answer模型没有加载,但我不确定如何在我的示例中为isLoaded正确设置观察者(如果这甚至是问题)

那么为什么App.Answer.find()在第一次被调用时返回空?

App.ChoiceController = Ember.ObjectController.extend({

    chosen: false,

    isResponse: function() {

        // successfully returns what I want from this controller's model
        var questionId = this.get('question.id')

        // gets DS.RecordArray of the model i'd like to compare with
        var answers = App.Answer.find()

        // filter to get a result that matches this.get('question.id')
        var answer = answers.filter(function(ans) {

            // returns all entries that match
            if(ans.get('question.id') == questionId) { return true }

        }, 'answers.isLoaded'); // this observer doesn't seem to hurt or help

        // get the final value I need 
        var choice = answer.mapProperty('choice.id')

        // if choice array is not empty, (should only have 1 element anyways)
        if(!choice) {
            this.set('chosen', choice[0]);

        } else {

            this.set('chosen', false);
        }
    }

})

以下是涉及的模型。两者都包含DS.belongsTo属性

App.Choice = DS.Model.extend({

    "question" : DS.belongsTo('App.Question')

})

App.Answer = DS.Model.extend({

    "question" : DS.belongsTo('App.Question')
    "choice" : DS.belongsTo('App.Choice')    

})

App.Question = DS.Model.extend({

})

修改

这是显示行为的jsfiddle。确保打开浏览器控制台,注意每个按钮需要2次点击才能使操作isResponse正常运行。 http://jsfiddle.net/iceking1624/QMBwe/

1 个答案:

答案 0 :(得分:1)

在阅读您的评论后,我已经找回了您的问题的解决方案,一种可能的方法是您可以定义AnswerController类型ArrayController(因为它是一组答案)然后在ApplicationRoute的{​​{1}}挂钩中设置此控制器。

  

主要目标:使用.find()访问当前控制器中可用模型以外的模型 - 以便将当前控制器模型中的数据与来自“外部”控制器模型的数据进行比较。

稍后,您可以要求使用setupController API和AnswerController从需要访问答案集合的控制器内部needs访问needs:['answers']数据,最后可以访问使用this.get('controllers.answer')的数据。您可以在needs API上找到有关here的更多信息。

在此处查看可行的正确解决方案,在1st点击上显示正确的选择:

App.AnswerController = Ember.ArrayController.extend({});

App.ApplicationRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this.controllerFor('answer').set('content', App.Answer.find());
  }
});

App.ChoiceController = Ember.ObjectController.extend({
  needs: ['answer'],
  chosen: false,
  isResponse: function() {

    var questionId = this.get('question.id');

    var answers = this.get('controllers.answer');

    var answer = answers.content.filter(function(ans) {
      if(ans.get('question.id') == questionId) { return true }
    }

    var choice = answer.mapProperty('choice.id');

    if(!choice) {
      this.set('chosen', choice[0]);
    } else {
      this.set('chosen', false);
    }
  }
});

这是一个有效的fiddle

希望它有所帮助。