【问题标题】:How to reload a child route's model inside a parent route?如何在父路由中重新加载子路由的模型?
【发布时间】:2017-01-23 04:21:38
【问题描述】:

我有一个嵌套路由(见下文)。

this.route('home', {
    path: '/'
}, function() {
    this.route('foo', {
        path: '/foo'
    });
    this.route('bar', {
        path: '/bar'
    });
});

foo 路由模型返回一个集合(数组)。

在父路由home 中,我定义了一个名为reloadModel 的函数。

我尝试从控制器重新加载模型但失败(产生未定义的函数错误,controller.get(...).refresh is not a function 或 controller.get(...).reload is not a function)。

    reloadModel() {
        const controller = this.controllerFor('home/a');
        controller.get('model').reload();
    },

我想从父路由重新加载子路由的模型;但是,我现在知道我可以获得子路由吗?

我的问题

我如何在路由foo 或bar 从路由home 中refresh 建模?

感谢任何提示。

【问题讨论】:

  • 您的错误get、controllerFor 或reload 中未定义哪个函数?
  • 我已经更新了这个问题。这是因为我从控制器中检索到的 model 只是一个普通对象吗?
  • 这肯定会导致问题,因为只有 Ember Data 模型有 reload 方法。

标签: javascript ember.js


【解决方案1】:

从父路由刷新子路由的模型通常不是一个好主意,因为它可能一开始就没有被加载。相反,从子节点刷新父节点的模型很好,因为按照设计,加载子路由需要首先加载将加载父模型的父路由。

根据您对此类功能的需求,您似乎将自己置于一个艰难的境地,可能应该考虑为什么我的设计需要我这样做,而不是如何我能做到。

无论如何,您可以使用的方法是在父 home 路由中调用您在子模型路由中调用的相同功能。

如果例如路由 a 有:

model() {
  return this.store.findRecord('a');
}

你会在home做类似的事情:

reloadModel() {
  this.store.findRecord('a', { reload: true }); // skip the cache and make the request
}

【讨论】:

  • 谢谢,您的回答对我来说确实有意义。我想我需要改变我的设计。
  • @LiXinyang 很高兴帮助队友。 Ember 的主要特点是它的设计非常严格,并试图通过使所有其他方法更难来推动我们采用正确的方法。因此,很多时候,困难的事情很可能是我们方法的缺陷,而不是 Ember 的能力不足。当然,这不是 100% 正确的,但这是一般行为。
  • fetchRecord 不是 ember-data 中的东西
  • @xoma yes it is 但我猜他们正在将其设为私有方法。我会相应地编辑
  • @nem035 我刚刚去 github 并尝试搜索它 - 它不在 master 上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2019-10-21
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多