【问题标题】:Ember model hook in Route vs Ember.Object.extend({})Route 与 Ember.Object.extend({}) 中的 Ember 模型挂钩
【发布时间】:2014-10-05 15:18:11
【问题描述】:

在 Ember 路由中使用模型钩子有什么区别:

App.PhotoRoute = Ember.Route.extend({
  model: function(params) {
    return Ember.$.getJSON('/photos/'+params.photo_id);
  }
});

与创建自己的 Ember 对象相比?

    App.PhotoModel = Ember.Object.extend({});
    App.PhotoModel.reopenClass({
    find: function(id){
       $.ajax({
      url: 'https://www.go.get.my.photo',
      dataType: 'jsonp',
      data: { id: id },
      success: function(response){
        return response.data;
      }
    });
  }
});

你为什么要使用一个而不是另一个?

【问题讨论】:

    标签: ajax ember.js


    【解决方案1】:

    一个是工作流的一部分,另一个是一个类。

    模型钩子将在访问时为路线提供模型(在这种情况下为照片)。此外,它将等待异步调用完成并使用 ajax 调用的结果。

    示例:http://emberjs.jsbin.com/

    扩展 Ember.Object 将定义一个可重用的类。它在很大程度上是整个 Ember 框架的构建块。

    App.MyModelObject = Ember.Object.extend({});
    

    一个更有用的例子是

    App.MyModel = Ember.Object.extend({
      total: function(){
        return this.get('val1') + this.get('val2');
      }.property('val1', 'val2')
    });
    
    var foo = App.MyModel.create({val1:3, val2:5});
    
    console.log(foo.get('total'));
    

    示例:http://emberjs.jsbin.com/xinozi/1/edit

    【讨论】:

    • Ember.Object.extend({}) 是否也等待异步完成?
    • Ember.Object.extend({}) 没有异步代码,它是声明。
    【解决方案2】:

    两者完全不同。 Ember 路由上的model 是一个 hook,ember 为您提供(从 api 获取数据并创建一个包含控制器所需数据的对象等)返回一个承诺,该承诺将被解析为路由控制器的模型,当所述路由进入并转换到时。另一方面,App.MyModel = Em.Object.extend({}) 创建了一个类,该类只是一个模板,可以从中实例化作为App.MyModel 实例的对象。 例如,如果您的应用程序想要为用户建模,它会有一个用户“模型”,例如

    App.User = Em.Object.extend({username: 'Alice'})
    

    或类似的东西。然而,如果你有一个看起来像 /#/user/id 的用户路由,那么路由上的 model hook 会是这样的

    model: function(params) {
      return new Ember.RSVP.Promise(function(success, failure) {
        //make an ajax call and invoke the success and failure handles here appropriately
      });
    

    【讨论】:

    • 钩子和模板(类)有什么区别?钩子在生命周期中只发生一次吗?
    • DS.attr 不会在 Ember 对象上定义。
    • @redconservatory 应用程序中的模型,(换句话说,类)对应于业务逻辑中的实体,另一方面,钩子是框架的 api,为您的应用程序提供“骨干” . Ember 路由器是一个机制,如果你明天改变你的框架,机制可能会改变,但你的模型通常不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多