[英]Ember.js - How share route model-data between more routes? - Why not load data in component?
[英]Ember.js 2.2 - How to update Route model from a Component?
使用Ember 2.2.0,我有一条路线:
Dash.BacklogReportsRoute = Ember.Route.extend
model: ->
@store.queryRecord "report", newest: true
和一个组件:
Dash.BacklogReportComponent = Ember.Component.extend
report: null
actions:
generate: ->
# Send the request.
$.ajax
type: "post",
url: "/reports/generate/#{new Date().getFullYear()}",
success: =>
# Update the model.
# TODO - how to reload the model in place? Or at least just refresh
# the Route so we don't have to reload the entire app.
window.location.reload()
其中包括作为模板的一部分:
<p>
Report was generated {{report.timestamp}}.
</p>
其中timestamp
是报表模型上的计算属性。
路由的模型是最新的Report对象,并且通过POST
generate
操作使服务器创建更新的(因此是较新的)Report。 我想更新该[较新]报告的时间戳。
我的问题是,在Ember 2中,如何使路线刷新? 我是Ember的新手,所以不确定是否可以从Component内部直接访问Route(或者如果可以的话 ,如果可以的话)。 我认为仅重新加载模型是行不通的,因为在成功执行POST
之后, @store.queryRecord "report", newest: true
将返回不同的模型(即,具有不同id
的记录) @store.queryRecord "report", newest: true
与加载页面时为@store.queryRecord "report", newest: true
。 POST
之后,现有模型将相同。
另外,我很高兴完全重新渲染Route(这是一个非常简单的页面)或再次转换到“此”页面,但是我不知道该怎么做。
现在,我只是强制使用老式的页面window.location.reload()
。
从另一种角度来看,也许有一种更惯用的方法来解决Ember的问题。
我是否应该使用路线加载所有(或某些)报告,并在POST
之后强制对该集合进行刷新? 我看到Enumerable
具有.firstObject
属性-是一个计算属性(换句话说,如果我的Routes模型是Reports的集合,而我又推到该Collection的前面,该更改会自动通过.firstObject
引用传播吗?)
那么您实际上不能直接从组件访问路由。 但这没问题,因为您可以使用动作来达到相同的效果。
因此,首先您需要从您的组件中的generate
动作发送一个动作:
Dash.BacklogReportComponent = Ember.Component.extend
report: null
actions:
generate: ->
# Send the request.
$.ajax
type: "post",
url: "/reports/generate/#{new Date().getFullYear()}",
success: =>
@sendAction('didGenerate')
接下来,您需要在模板中挂接操作,以便在调用控制器/路由时得到通知:
{{backlog-report report=report didGenerate='didGenerateReport'}}
现在,您可以在控制器或路由中“捕获”该动作。 我们将在另一条路线中进行操作,以便我们对其进行刷新:
Dash.BacklogReportsRoute = Ember.Route.extend
actions:
didGenerateReport: ->
@refresh()
model: ->
@store.queryRecord "report", newest: true
抱歉,如果我在CoffeScript中犯了任何错误(有一段时间没有使用它了)。 另外还有其他可以改进的地方。 通常,我不会将ajax调用放置在组件中,如果可能的话,我会将其放置在控制器/路由中,并通过操作进行调用(我的经验是,最好避免在组件中放置ajax调用,是用例)。
如果您还没有阅读,我通常会建议阅读所有的余烬指南 。 它们非常好,虽然您从一开始就不会理解所有内容,但您至少或多或少会知道要寻找的东西或可能的东西。
如果您需要手动重新加载页面,确实应该有更好的方法。 与其他类似框架一样,Ember是SPA(单页应用程序),当仅高效更新页面的一部分时,它们发挥了神奇作用。
他这样说,如果你要访问的router
从controller
/ component
被发送到一个动作router
和处理,该变化action
。
请参阅冒泡的动作 https://guides.emberjs.com/v1.10.0/templates/actions/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.