EmberJS 咨询一个 Ember.js 中如何正确地使用 Controller 实现 Decorate 效果

wuwx · 2015年09月17日 · 最后由 darkbaby123 回复于 2015年09月18日 · 2929 次阅读

我用 rails + grape + carrierwave 搭建的一套 api,这套 api 的地址是 www.xxxx.com/api 这个 api 中有一个字段是上来来的图片,输出来的的形式是: { "image_url": "/uploads/helloworld.gif" }

然后我又尝试用 emberjs 1.13.8 搭建了一套前端界面,使用的域名是 m.xxxx.com,然后通过 RESTApi 的适配器获取 API 的数据,也就是说我需要把获取到的 image_url 加上真实的域名前缀,才能在 m.xxxx.com 下显示。

起先我使用 emberjs 中的 ArrayController + ObjectController 把我需要的效果实现了,把 decorate 放在 ObjectController 里实现了,但是发现各种警告,说这样的用法 2.0 会被干掉。

于是我就各种翻各种找,也没找到到底应该怎么实现才比较靠谱,我知道有一种办法是直接在 Route 里把数据给改了,不过我总觉得这么做很不好看,感觉怪不舒服的,所以想咨询下有没有能让人心旷神怡的实现方案。

谢谢啦~~~~

共收到 11 条回复

后端输出完全的url就可以了,前端没必要去折腾这个。

#1楼 @billy 后端输出的时间前端也需要格式化的,所以感觉这个坑是不能避免的……

@wuwx 不明白你的意思,什么叫前端格式化。

#3楼 @billy "created_at":"2015-09-17T20:31:04.000+08:00" 也需要好看一些呀

原来说的是这个,我还以为你说的是image url, 那个直接输出完全url就可以了,换了cdn前端都不用改。

这些都是helper, view层面的,在Rails里面你也不能写到controller里面啊。日期用moment.js弄一下就可以了。

#5楼 @billy 但是 emberjs 1 里,controller 就是被当做 decorator 用啊……

Rails做个patch,统一输出,我是这么干的。

# config/initializers/monkey_patch_time.rb
class ActiveSupport::TimeWithZone
  def as_json(options = {})
    self.to_i
  end
end

正确的做法是 helper,可以直接在模板里用,包括时间格式化也是。一定要折腾,可以用 serializer 在数据层解决,一劳永逸,controller 其实不适合做数据转换的,1 的时候也一样。

时间格式我是用这样一个helper:

import Ember from 'ember';

export default Ember.Helper.helper(function(params, hash) {
  return moment(params[0]).format("YYYY-MM-DD HH:mm");
});

#8楼 @nightire #9楼 @jesktop

明白了,非常感谢

大部分情况应该用 helper 格式化时间。这里只提供 helper 和 Ember Data 之外的另一种思路。

有时候可能我们需要用 Ember Object 封装 API 传过来的 json,其实这就是 model/decorator 的概念了。你自己可用 Ember Object 定义你想要的类。

let User = Ember.Object.extend({
  createdTime: Ember.computed('created_at', function() {
    return moment(this.get('created_at'))
  }).readOnly()
})

let rawData = {name: "David", created_at: "2015-09-17T20:31:04.000+08:00"}
let user = User.create(rawData)

user.get('name')       # David
user.get('createdTime')  # moment object

另外,Ember 1 时代的 ObjectController 本质上是使用了 Ember.ObjectProxy 来代理属性到 model 的。貌似 ObjectProxy 和 ArrayProxy 都被废弃掉了。所以不建议用它们。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册