0

ember データを使用して正しく保存する方法を見つけようとしています。私のモデルは次のように定義されています。

AS.AnalyticsRun = DS.Model.extend({
'exerciseId'                : DS.attr('number'),
'exerciseRunId'             : DS.attr('number'),
'queued'                    : DS.attr('boolean'),
'final'                     : DS.attr('boolean'),
'analyticsRunParameters'    : DS.hasMany('analyticsRunParameter')
});


AS.AnalyticsRunParameter = DS.Model.extend({
'name'                  : DS.attr('string'),
'category'              : DS.attr('string'),
'filteredOut'           : DS.attr('boolean', { 'default' : false }),
'equalsDefaultValue'    : function() {
    /* computed property : returns css class name that should be used for the row with parameter having value other than default one*/
    return this.get('value') == this.get('default');
}.property('value', 'default'),
'analyticsRun'          : DS.belongsTo('analyticsRun')

});

そして、コントローラーには、挿入を実行する関数があります。

 createNewAnalyticsRun : function(createRunFrom, createRunFromId){
    var self = this;

    $.ajax({
        type: "POST",
        url: AS.baseURL+"analyticsRuns",
        data: {"createFrom": createRunFrom, "id" : createRunFromId, "exerciseId" : AS.Analytics.get('exerciseId'), "exerciseRunId" : AS.Analytics.get('exerciseRunId')},
        success: function(newAnalyticsRun){
            self.get('store').push('analyticsRun', newAnalyticsRun.analyticsRun);
            for(var i = 0, len = newAnalyticsRun.analyticsRunParameters.length; i<len; i++){
                self.get('store').push('analyticsRunParameter', newAnalyticsRun.analyticsRunParameters[i]);
            }
        },
        dataType: "JSON"
    });

}

私のルートは次のようになります。

AS.AnalyticsRunsIndexRoute = Ember.Route.extend({
model : function() {
    var store = this.get('store');
    return store.find('analyticsRun',{'exerciseId':1});
}

});

私のルートが次のように設定されている場合、この設定は完全に機能します(保存時に追加されたデータでテンプレートを更新します):

 return store.find('analyticsRun'); 

しかし、

return store.find('analyticsRun',{'exerciseId':1});

追加されたレコードの ExerciseId が 1 の場合でも、保存時にテンプレートが更新されません。ページを更新すると、新しく追加されたデータが表示されます。検索にフィルターを追加すると問題が発生すると確信しています。

解決策:私は、このように、@ sly7_7によって提供されたソリューションと合流するデータを取得するために、残りのAPIへのjquery ajax呼び出しを使用することになりました

AS.AnalyticsRunsIndexRoute = Ember.Route.extend({
model : function() {
    var store = this.get('store'), self = this;

    var exerciseId = //get exercise id from some other logic

    $.ajax({
        type: "GET",
        url: AS.baseURL+"analyticsRuns",
        data: {"exerciseId" : exerciseId},
        success: function(analyticsRunData){
            for(var i = 0, len = analyticsRunData.analyticsRuns.length; i<len; i++){
                self.get('store').push('analyticsRun', analyticsRunData.analyticsRuns[i]);
            }
            for(i = 0, len = analyticsRunData.analyticsRunParameters.length; i<len; i++){
                self.get('store').push('analyticsRunParameter', analyticsRunData.analyticsRunParameters[i]);
            }
        },
        dataType: "JSON"
    });

    //perfect since I need to return model anyways without calling find
    return store.filter('analyticsRun', function(analyticRun){
        return analyticRun.get('exerciseId') == exerciseId;
    });
},
setupController : function(controller,model){
    this._super(controller,model);
    controller.set('analyticsRunSelectOptions',controller.initAnalyticsRunSelectOptions());
    this.controllerFor('analysisTemplates').set('model',controller.get('store').find('analysisTemplate'));
}
});
4

1 に答える 1

1

store.find の代わりに store.filter を使用しようとしましたか? フィルタリングして結果をライブ配列として保持することが必要な場合は、filter が最適です。モデル フックでは、次のように記述します。

AS.AnalyticsRunsIndexRoute = Ember.Route.extend({
  model : function() {
    store.find('analyticsRun', {exerciseId: 1});
    return store.filter('analyticsRun', function(analyticRun){
      return analyticRun.get('exerciseId') == 1;
    });
  }

});

于 2013-09-19T22:20:37.037 に答える