使用Ember。$。ajax()发送具有关系的数据

时间:2017-01-05 15:12:30

标签: javascript jquery ruby-on-rails ember.js ember-data

我正在经历一个令人头痛的问题。我正在使用Ember 2.0(有点旧,我知道......!)。由于项目的性质(使用ruby-on-rails),我们必须使用Ember,$.ajax()来管理数据而不是Ember-Data。我们正在尝试发送一个与另一个数据模型有关系的数据对象,但它会抛出:

Uncaught TypeError: Cannot read property 'options' of undefined

Ember(控制员):

import Ember from 'ember';

export default Ember.Controller.extend({
  sendFileData(url, verb, filetype, isSelected) {
    let controller = this;

    Ember.run.next(this, () => {
      Ember.$.ajax({
        url: url,
        type: verb,
        data: {
          title: controller.get('model.title'),
          files: Ember.A([
            controller.store.createRecord('file', {
              selected: isSelected,
              pdf: (filetype === 'pdf') ? 'pdf' : null,
              html: (filetype === 'html') ? 'html' : null
            })
          ])
        }
      }).then(() => {
        controller.set('successMessage', 'Pdf Data sent to backend!');
      }, () => {
        controller.set('successMessage', 'Something is wrong with PDF data!');
      });
      console.log('end sendFileData()!');
    });
  },

  actions: {

    exportData() {
      let controller = this,
        dataLink = controller.get('model.dataLink');

      console.log('Data link: ', dataLink);
      console.log('Model title: ', controller.get('model.title'));

      if (controller.get('isPdfChecked')) {
        console.log('PDF is chosen!');
        controller.sendFileData(dataLink, 'POST', 'pdf', controller.get('isPdfChecked'));
      }

      if (controller.get('isHtmlChecked')) {
        console.log('HTML is chosen!');
        controller.sendFileData(dataLink, 'POST', 'html', controller.get('isHtmlChecked'));
      }

      if (!controller.get('isPdfChecked') && !controller.get('isHtmlChecked')) {
        console.log('No options chosen!');
      }
    }
  }
});

型号:

// document model
import DS from 'ember-data';

export default DS.Model.extend({
  title: DS.attr('string'),
  content: DS.attr('string'),
  created_at: DS.attr('date'),
  start_at: DS.attr('utc'),
  end_at: DS.attr('utc'),
  user: DS.belongsTo('user', { async: true }),
  versions: DS.hasMany('version', { async: true }),
  files: DS.hasMany('file', { async: true }), // here's the relationship to file model

  dataLink: Ember.computed('id', function() {
    return "/export/data/document/" + (this.get('id'));
  })
});


// file model
import Ember from 'ember';
import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  url: DS.attr('string'),
  created_at: DS.attr('date'),
  document: DS.belongsTo('document', { async: true }), // here's the relationship to document model
  filetype: DS.attr('string'),
  selected: DS.attr('boolean'),
  pdf: DS.attr('boolean'),
  html: DS.attr('boolean')
});

不知道该怎么做:(...而且我们不能再添加插件ember-data-save-relationships或类似的,因为项目的结构如何。

非常感谢

1 个答案:

答案 0 :(得分:1)

您的调试设置是什么?你的浏览器中有Ember插件吗? 你可以发布完整的调试输出吗? 您是否已逐步查看代码以查看错误发生的位置? 您可以添加断点以查看此时是否发生了错误。

像Ember-AJAX这样的东西

`

export default Ember.Controller.extend({
  ajax: Ember.inject.service(),
  actions: {
    exportData() {
      let ajax = this.get('ajax')
      dataLink = this.get('model.dataLink');
      if (this.get('isPdfChecked')) {
        console.log('PDF is chosen!');
        ajax.post(dataLink, {'files':{'pdf':'pdf', 'selected': true}})
         .then(this.dostuff);
      }

      if (this.get('isHtmlChecked')) {
        console.log('HTML is chosen!');
        ajax.post(dataLink, {'files':{'html':'html', 'selected': true}})
         .then(this.dostuff);
      }

      if (!this.get('isPdfChecked') && !this.get('isHtmlChecked')) {
        console.log('No options chosen!');
      }

`在dostuff(文件)中创建一条记录,回复错误......