【问题标题】:You need to pass a model name to the store's modelFor method您需要将模型名称传递给商店的 modelFor 方法
【发布时间】:2017-01-29 23:02:13
【问题描述】:

我无法让 hasMany belongsTo 关系发挥作用。

当我尝试列出文章的 cmets 时,我有 articles/show 视图,但我不断收到标题中指出的错误。

它是属于 belongsTo:DS.belongsTo('article') 的东西,但我不知道它是什么。

这是我的文件。

routes/articles/show.js

import Ember from 'ember';
import RSVP from 'rsvp';

export default Ember.Route.extend({
  model(params) {
    return RSVP.hash({
      article: this.store.find("article", params.id),
      comments: this.store.query('comment', { articleId: params.id })
    });
  }
});

controllers/articles/show.js

import Ember from 'ember';

const { computed: { alias, readOnly } } = Ember;

export default Ember.Controller.extend({
  article: alias('model.article'),
  comments: alias('model.comments'),
  length: readOnly('comments.length')
});

模板/文章/show.hbs

<h3>Comments ({{comments.length}})</h3>
{{#each comments as |comment|}}
  <p>Author: {{comment.user.name}}</p>
  <p>Somebody said: {{comment.body}}</p>
{{/each}}

适配器/comment.js

import ApplicationAdapter from './application';
export default ApplicationAdapter.extend({});

serializers/comment.js

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  attrs: {
    user: { embedded: 'always' },
    article: { embedded: 'always' }
  }
});

序列化器/article.js

从“ember-data”导入 DS;

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    comments: { embedded: 'always' }
  }
});

models/article.js

import DS from 'ember-data';
import Ember from 'ember';

const { attr, hasMany } = DS;
const { computed: { gt } } = Ember;

export default DS.Model.extend({
  title:        attr('string'),
  content:      attr('string'),

  authorName:   attr('string'),
  authorAvatar: attr('string'),
  authorUrl:    attr('string'),

  comments:     hasMany('comment', {async: true}),

  hasAvatar: gt('authorAvatar.length', 0)
});

编辑:

我在这里添加了 cmets 中要求的注释模型代码。

models/comment.js

import DS from 'ember-data';

const { belongsTo, attr } = DS;

export default DS.Model.extend({
  article: belongsTo(),
  user: belongsTo(),

  body: attr('string')
});

这是检查员的堆栈跟踪:

ember.debug.js:16905 Assertion Failed: You need to pass a model name to the store's modelFor method
Error
    at assert (http://ffl.com:8000/assets/vendor.js:16268:13)
    at Object.assert (http://ffl.com:8000/assets/vendor.js:27196:34)
    at assert (http://ffl.com:8000/assets/vendor.js:135212:37)
    at Class.modelFor (http://ffl.com:8000/assets/vendor.js:145201:41)
    at Class._internalModelForId (http://ffl.com:8000/assets/vendor.js:144337:29)
    at Class._pushResourceIdentifier (http://ffl.com:8000/assets/vendor.js:145716:19)
    at BelongsToRelationship.updateData (http://ffl.com:8000/assets/vendor.js:142394:36)
    at BelongsToRelationship.push (http://ffl.com:8000/assets/vendor.js:142976:14)
    at http://ffl.com:8000/assets/vendor.js:145795:20
    at http://ffl.com:8000/assets/vendor.js:141943:18
defaultDispatch @   ember.debug.js:16905
dispatchError   @   ember.debug.js:16888
onerrorDefault  @   ember.debug.js:30389
trigger @   ember.debug.js:57833
(anonymous) @   ember.debug.js:58717
invoke  @   ember.debug.js:339
flush   @   ember.debug.js:407
flush   @   ember.debug.js:531
end @   ember.debug.js:601
run @   ember.debug.js:724
join    @   ember.debug.js:746
run.join    @   ember.debug.js:21556
hash.success    @   rest.js:954
fire    @   jquery.js:3305
fireWith    @   jquery.js:3435
done    @   jquery.js:9242
(anonymous) @   jquery.js:9484

【问题讨论】:

  • 你有代码,用空参数调用modelFor方法吗?您是否定义了评论模型?如果是这样也发布一个?如果可能,包括此断言错误的堆栈跟踪。确定哪个方法正在触发modelFor。最新版本find 是私有方法。
  • @kumkanillam 我按照您的要求添加了两者。希望这会有所帮助。
  • 我们不需要在 belongsTo 关系中提到模型名称,例如 article: belongsTo('article')user: belongsTo('user)` 用于评论模型。我不确定这一点。如果它对您没有帮助,那么您可能需要了解服务器响应数据格式。
  • 我之前确实提到过(没有改变),但如果名称与关系匹配,则不需要。
  • 我在整个代码中没有 modelFor 调用。 BTW:我在这里你可以查看这个项目的整个源代码。这是基本的。 github.com/wilgoszpl/frontendflow-ember/tree/…

标签: ember.js ember-data


【解决方案1】:

我检查了您的问题和回购。问题只是 Ember.js 中的注释序列化器。应该是:

import DS from 'ember-data';

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    article: { embedded: 'always' },
    user: { embedded: 'always' }
  }
});

【讨论】:

    【解决方案2】:

    我克隆了您的项目分支 refactor-and-upgrade-ember 但海市蜃楼尚未完成。于是我看了一下代码

    headTags() {
      let article = this.modelFor(this.routeName);
    }
    

    这是文章显示的路线,您可以尝试删除它并尝试。

    【讨论】:

    • 确实,但即使在删除它之后,也会出现此错误 - 当我准备问题时,我删除了这些标签以确保 - 这就是我在上面的 cmets 中提到的原因,我没有 @ 987654322@ - 但感谢您的努力,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多