【问题标题】:Custom Dynamic Segment (NOT ID) - EmberJS自定义动态段(非 ID) - EmberJS
【发布时间】:2013-11-17 07:17:09
【问题描述】:

我想在 Ember 中使用动态段路径而不使用 :id 属性

根据 Ember 指南,我使用 serialize 方法来实现这一点。

这是我的路由器:

App.Router.map(function() {
    this.resource("orders", function(){
        this.resource('order', { path: ':order_sequence'}, function(){
            this.route('edit');
        })
    });
});

还有我的路线:

var OrderRoute = Ember.Route.extend({
    model: function(params) {
        return this.store.find('order', params.order_sequence)
    },
    serialize: function(model) {
        return { order_sequence: model.get('sequence') };
  }
});

module.exports = OrderRoute;

但是,我的 URL 仍然使用路径中的 id 属性而不是 sequence 属性..

有什么想法吗?

【问题讨论】:

  • 我认为您的OrderRoute 没有被使用。所以默认情况下,ember 会生成一个使用 id 的默认行为的路由,而不是 :order_sequence。您可以在您的序列化方法中仔细检查这一点,并在其中添加警报或 console.log。你能向我确认吗?另外你在使用 ember-tools 吗?订单路径的文件名和位置是什么?
  • 所以我在我的序列化方法中添加了一个警报,它实际上会在页面加载时触发。是的,我正在使用 ember-tools。我的 order_route 文件的路径是:/js/routes/order_route.js
  • 顺便说一句,我使用 FIXTURES 作为我的示例数据,不确定这是否与它有关..
  • 不,我很确定我们没有正确理解您的问题。如果我在下面的回答是正确的,我们应该更新您的问题以更正确地显示您的问题。

标签: ember.js ember-router


【解决方案1】:

您的浏览器是否正在缓存某些内容,因为这是正确的。您是否在任何 transitionTo/transitionToRoute/link-to 中传递 id 而不是序列/模型?

哦,您不是在谈论 url 中的 slug,也不是路由,您是在谈论模型的 id。您需要为该特定模型创建一个序列化程序并覆盖主键

App.OrderSerializer = DS.RESTSerializer.extend({
  primaryKey: 'sequence'
});

Fixture Adapter 对定义 id 有限制,但您可以通过扩展 Fixture Adapter 并覆盖单个方法来懒洋洋地绕过它

App.OrderAdapter = DS.FixtureAdapter.extend({

 fixturesForType: function(type) {
  if (type.FIXTURES) {
   var fixtures = Ember.A(type.FIXTURES);
   return fixtures.map(function(fixture){

    // aka we massasge the data a bit here so the fixture adapter won't whine so much
    fixture.id = fixture.sequence;
    var fixtureIdType = typeof fixture.id;
    if(fixtureIdType !== "number" && fixtureIdType !== "string"){
      throw new Error(fmt('the id property must be defined as a number or string for fixture %@', [fixture]));
    }
    fixture.id = fixture.id + '';
    return fixture;
   });
  }
  return null;
 },
});

【讨论】:

  • 不,清除缓存并从其他浏览器检查。而且,我通过直接访问 URL 进行测试,而不是从任何链接到或转换到挂钩。
  • 如果你是直接访问url,如何体现它使用的是id而不是sequence?
  • 因为当我直接访问 /#/orders/5 时,它会加载 id 为 5 的对象——我什至没有序列:5 .. 从技术上讲,如果我访问那个 url,它不应该工作..我基于我的测试
  • url 的 slug 和序列化器与 Ember Data 无关。请务必记住,ED 和 Ember 是解决不同问题的两种不同产品。
  • 我想将“sequence”作为主键的方法是有意义的。但是,我已经从我的 FIXTURES 中删除了“id”属性并添加了您的 App.OrderSerialzer 方法,但仍然出现错误:Uncaught Error: the id property must be defined as a number or string for fixture {sequence: 1, orders: ....
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多