【问题标题】:Determine if hasMany -> belongsTo item has been created in Ember.js确定是否在 Ember.js 中创建了 hasMany -> belongsTo 项
【发布时间】:2013-12-13 14:54:45
【问题描述】:

我正在使用 Ember:1.3.0-beta.2 和 Ember 数据:1.0.0-beta.2

这是我的设置:

型号

Rise.User = DS.Model.extend({
  //....
  user_training_plans: DS.hasMany('training_plan', { async: true }),
  user_training_histories: DS.hasMany('training_history', { async: true }),
});

Rise.TrainingHistory = DS.Model.extend({
  //....
  user: DS.belongsTo('user', { async: true }),
  training_resource: DS.belongsTo('training_resource', { async: true })
});

Rise.TrainingPlan = DS.Model.extend({
  //....
  user: DS.belongsTo('user', { async: true }),
  training_resource: DS.belongsTo('training_resource', { async: true })
});

在控制器操作中,我试图将训练资源从用户的训练计划“移动”到训练历史记录。我想在添加之前确定培训资源是否已添加到培训历史记录中。

我想做这样的事情,目前正在训练计划中

markCompleted: function(trainingPlanItem) {
  completed_training_resource_id = trainingPlanItem.get('training_resource.id');

  this.controller.get('user_training_histories').then( function(user_training_histories) {
    var already_exists = user_training_histories.any( function(item) {
      var item_id = item.get('training_resource').get('id');
      if (item_id == completed_training_resource_id) {
        return true;
      }
    });

    // ...continues
  });
}

当然,item.get('training_resource').get('id'); 会在未获取数据的情况下返回一个 promise,因此此 if (item_id == completed_training_resource_id) 比较行无法正常工作。

有没有办法运行any 并在里面使用promise?或者有没有办法在不加载培训资源的情况下查看training_resource_id?这是belongs_to 关系,因此从服务器获取训练资源id。

【问题讨论】:

  • 我认为您应该能够访问您的 user_training_history 中的 training_resource_id,如下所示:item.get('training_resource_id')
  • 不幸的是,该值是 undefined... 不过,我应该能够访问该值是有道理的,因为我的服务器将关联的 id 传递给了 Ember。
  • 我还没有使用过那个 ember-data 版本。您是否尝试过 trainingResourceId ?如果您在模型中定义该属性怎么办?,也许模型需要它来映射它
  • 也尝试过,结果相同。我可以在模型中定义该属性,并且最终可能会走这条路,但我很沮丧,因为 Ember 已经知道该模型 id 是什么并且已经将它保存在某个地方。

标签: ember.js ember-data has-many


【解决方案1】:

Get belongsTo ID without fetching record

我不确定我是否同意这条路线,但你可以从数据 obj 中获取它

item.get('data.training_resource.id')

【讨论】:

  • 或者,item.get('data.training_resource.id')。如果您对检查user_training_histories 是否有重复项有任何更好的建议,请告诉我!也许有比使用any 更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多