我怎样才能避免“断言失败:`id`传递给`findRecord()`在刷新一个余烬页时必须是非空字符串或数字?

时间:2017-05-31 23:02:38

标签: ember.js

关于Ember的这个非常讨厌的功能,我不知道如何绕过。我可能有一个类似于以下内容的网址

http://{my-blog-name}/posts/view/{some-blogpost-ID}

我访问此页面的方法是点击{my-blog-name}/posts页面内的链接。这可以工作,并将按预期显示页面。但是,如果我尝试刷新页面,或者我只是在我的网址搜索框中输入我的http://{my-blog-name}/posts/view/{some-blogpost-ID},我会得到

Assertion Failed: `id` passed to `findRecord()` has to be non-empty string or number

以下是我导航到posts/view/{some-blog-id}页面的方法。

post.js

import Ember from 'ember';

export default Ember.Route.extend({
    model: function() {
        return this.store.findAll('post');
    }
});

posts.hbs

<li class="title-list-item">{{#link-to "posts.view" posts}}{{posts.title}}{{/link-to}}</li> 

view.js

import Ember from 'ember';

var siteId;

export default Ember.Route.extend({
    model(params) {
        siteId = params.site_id;
        return this.store.findRecord('post', params.site_id);
    }
});

view.hbs

<div id="Links">
  <h1 id="blog-header-title">My Blog</h1>
  <!--<p>{{!#link-to 'welcome'}} See about me{{!/link-to}}</p>-->
  {{outlet}}
</div>

{{outlet}}

router.js

import Ember from 'ember';
import config from './config/environment';

const Router = Ember.Router.extend({
  location: config.locationType,
  rootURL: config.rootURL
});

Router.map(function() {
  this.route('index', { path: '/' }); // This is usually automatic if path undeclared, but declared here to support /index below
  this.route('posts', function() {
    this.route('view', {path: '/view/:post_id'});
  });
  this.route('welcome');
}

这真是令人沮丧,因为这意味着我无法创建博客文章并与朋友分享链接。为什么会发生这种情况,有没有一种好方法可以绕过它?

1 个答案:

答案 0 :(得分:1)

posts.js route返回所有可用的帖子,即RecordArray

<li class="title-list-item">{{#link-to "posts.view" posts}}{{posts.title}}{{/link-to}}</li>

所以在上面posts - 指的是单一帖子模型或者帖子模型的RecordArray?如果以上是单一模型,那么您将在view.js的模型钩子中收到params.post_id,目前您正在使用params.site_id而不是params.post_id

不执行模型钩子的原因。  https://guides.emberjs.com/v2.13.0/routing/specifying-a-routes-model/#toc_dynamic-models

  

注意:具有动态段的路径将始终具有其模型挂钩   通过URL输入时调用。如果输入路线   转换(例如,当使用链接到Handlebars帮助程序时)和a   提供了模型上下文(链接到的第二个参数),然后是钩子   没有执行。如果提供了标识符(例如id或slug)   相反,然后将执行模型钩子。