应该在哪里存储接口状态?

是否有一个官方的故事,在哪里接口状态(而不是持久的模型状态)应该居住在Ember.js应用程序中?

在路由器文档的“响应用户发起的事件”部分中,有一个将点击事件委派给照片的“showPhoto”方法的示例,但是具有模型“show”本身似乎是一种令人不快的担忧。

我知道在很多情况下,状态应该存储在路由器中,以便在URL中表示接口状态,并在刷新页面或将URL发送给某人时恢复。 但是非等级状态如何,例如页面上选择的项目列表?

理想情况下,该类型的状态将被序列化为查询/散列参数(例如:http://www.hipmunk.com/flights/QSF-to-NYC#!dates=Sep15,Sep16p1;kind=flight&locations=QSF,YYZ&dates=Sep15 ,Sep23〜tab = 1),但据我所知,路由器不提供这种功能,是吗?

在BackboneConf上,Jeremy Ashkenas说在Backbone中做到这一点的正确方法是将状态存储在模型上(他有一个带有“selected”字段的模型示例)。 但我相信汤姆戴尔说他不认为这是一个好主意,而不是在Ember应该如何做。 不幸的是,我不记得他提到应该如何做。


如果你希望状态是可路由的(即通过url访问),那么它需要通过ember的路由器进行序列化和反序列化。 如果状态是瞬态的并且不可路由,那么它最好保存在控制器上。

如果需要在多个模型中表示复杂的接口状态(例如,用于选择列表中的项目),请考虑维护包装基础数据模型的控制器特定的对象数组。 我认为直接在模型上表示视图状态是很冒险的,特别是如果这些模型在多个视图中使用。

对于您提供的示例,您可能会这样做,以便连接复杂的路线:

Ember.Route.extend({
  route: "flights/:cities/dates/:dates",

  serialize: function(router, context){
    return {cities: context.get('cities'),
            dates:  context.get('dates')};
  },

  deserialize: function(router, params){
    // return a context object that will be passed into connectOutlets()
    return {cities: params.cities,
            dates:  params.dates};
  },

  connectOutlets: function(router, context) {
    // pass the context from deserialize() in as the content of a FlightController
    router.get('applicationController').connectOutlet('flight', context);
  }
})

请注意,您也可以使用诸如“航班?城市=:城市和日期=:日期”之类的路线,但上述内容可能更干净,更适合搜索引擎优化。


加布里埃尔的评论后扩展:如果你想维护一个搜索数组,每个搜索都驻留在它自己的选项卡中,我建议将这些搜索的数据保存在应用程序级别的数组中(例如App.currentUser.activeSearches)。 我的推理是,你不希望每次用户切换标签时都不得不重新创建这些数据。 相反,路由器会检索该数据deserialize()然后把它作为背景下connectOutlets() 切换制表符时,应根据此对象快速重构用于表示此数据的视图和控制器。 让我从上面扩展我的例子:

Ember.Route.extend({
  route: "flights/:cities/dates/:dates",

  serialize: function(router, context){
    return {cities: context.get('cities'),
            dates:  context.get('dates')};
  },

  deserialize: function(router, params){
    // find or create a "Search" object that contains the filters and results,
    // which will be passed into connectOutlets()
    return App.currentUser.findOrCreateSearch({cities: params.cities,
                                               dates:  params.dates});
  },

  connectOutlets: function(router, context) {
    // pass the context (a search object) from deserialize() in as the content of a FlightController
    router.get('applicationController').connectOutlet('flight', context);
  }
})
链接地址: http://www.djcxy.com/p/63751.html

上一篇: where should interface state be stored?

下一篇: Change row color from cell value in google visualization table