Ember.js

时间:2016-06-30 22:38:01

标签: ember.js

我试图围绕动态细分包围,我希望能够使用slug或其他属性而不是id。当我能让事情发挥作用时,感觉就像侥幸。 (我使用的是ember 2.7 +)

我一直在寻找以下来源/主题的想法: https://guides.emberjs.com/v1.10.0/cookbook/ember_data/linking_to_slugs(1.10) http://discuss.emberjs.com/t/slugs-for-replacing-id-path-for-dynamic-segments

我打算使用余烬数据,但我想确保我能够控制 - 所以我不想使用:post_slug / underscore样式,它有一些我想要的内置魔法避免。

这是ember-twiddle 以下是step-by-step commits in a github repo



我的思考过程


从概念上讲,我可以说我需要一份猫咪名单 - 所以我需要描述一下这只猫的模型。是

模型/ cat.js

import Model from "ember-data/model";
import attr from "ember-data/attr";

export default Model.extend({
  name: attr('string'),
  slug: attr('string')
});


2.定义动态细分将在网址中的位置。我将使用catId来证明一个点而不是cat_id或:id就像我见过的大多数教程一样。对于这个例子,我也写了一个实际的app结构而不是最小的路由器 - 来测试它的边缘。 +如果我以后需要这样的东西怎么办:animals.com/cats/:catId/best-friend/:dogId

router.js

Router.map(function() {
  this.route('index', { path: '/' });
  this.route('cats', { path: '/cats' }, function() {
    this.route('index', { path: '/' }); // list of cats
    this.route('cat', { path: '/:catId' }); // cat spotlight
  });
});


3.将catData拉入商店〜/ cats route

路由/ cats.js

import Ember from 'ember';

const catData = [
  {
    id: 1,
    name: 'Dolly',
    slug: 'dolly'
  },
  {
    id: 2,
    name: 'kitty cat',
    slug: 'kitty-cat'
  },
  {
    id: 3,
    name: 'Cleopatra',
    slug: 'cleo'
  }
];

export default Ember.Route.extend({
  model() {
    return catData;
    // return this.get('store').findAll('cat'); // with mirage or live api
  }
});


来自评论的更新:

  

我不相信您可以将queryRecord与测试数据一起使用。   Ember数据对查询和queryRecord愚蠢;它没有假设   有关您的数据的任何信息,只需将呼叫传递给您的服务器即可。

〜@ xcskier56

所以这有点吹我的旋风。 git repo的例子是幻影。


4.创建模板...... +设置' cat'路线。记录在商店 ...对吗?所以我应该能够偷看'在他们的基础上。文档使用params - 但 -

  

Ember将从URL中提取动态细分的值   你 - 并将它们作为哈希作为哈希传递给模型钩子作为第一个参数

:〜所以params对象名称并不特别,可能真的是你想要的任何东西......而且只是用哈希代替 - 所以到那一点/我使用' passedInThing'只是为了控制混乱的约定(许多教程使用 param 而不是 params

路由/猫/ cat.js

model( passedInThing ) {
  return this.store.peekRecord('cat', passedInThing.catId );
} // not going to happen - but in theory...

model( passedInThing ) {
  return this.store.queryRecord('cat', { slug: passedInThing.catId } );
}


5.此时,我应该能够导航到url / cats / 2 - 并且2应该通过模型钩子传递到查询。 "去找一只猫'#39; id为2" - - 对??? ((旋转示例使用了一组硬编码的catData - 但在我的其他尝试中,我使用海市蜃楼组合了固定装置和动态slu :: https://github.com/sheriffderek/dynamic-segments-tests/commits/queryRecord


6.在段中输入有效 - 但对于link-to助手,我需要传入明确的cat.id

{{#link-to 'cats.cat' cat.id}}
  <span>{{cat.name}}</span>
{{/link-to}}


7。我可以完成所有工作 - 但我不想在网址中找到ID。我希望cats/cleo使用&#39; slug&#39; 〜理论上我可以将catId catSlugcat.id切换为cat.slug等等 - 但事实并非如此。我已经看过很多教程,但是它们已经过时了。我尝试传递{ slug: params.slug }以及查找查询和窥视等的每个组合。有时网址会起作用,但模型不会呈现 - 或者相反。


8。这似乎是101件事。任何人都可以向我解释这个吗?哦,明智的emberinos - 来帮助我!


更新

1 个答案:

答案 0 :(得分:2)

我一直在努力解决同样的问题,AFIK没有办法在不查询服务器的情况下处理这个问题。虽然这是旧的,代码有点过时,逻辑仍然存在。 http://discuss.emberjs.com/t/use-slug-for-page-routes-id-for-store-find/6443/12

我所做的是使用store.queryRecord()然后我的服务器能够返回通过slug获取的记录。

这就是路线的样子:

model: function (params) {
  return this.store.queryRecord('cat', {slug: params.catSlug})
}

这样您就不会在网址中公开ID,但每次模型被点击时都会向商店发出查询。在ember-data中似乎有一些关于缓存queryqueryRecord的讨论,但还没有任何工作。

其他有用的资源: