提问者:小点点

使用enber-data/DataStore将外部数据加载到Ember模板中


这就是我要做的:

  1. 发出ajax请求以从PHP脚本中检索JSON数据
  2. 将该信息插入DataStore模型
  3. 将这些模型存储在控制器中
  4. 使用带有车把模板的{{#each}}显示信息

>

  • enpe-data是否有内置的检索数据的方式?如果没有,应该在哪里实现AJAX请求?

    将JSON数据插入DS模型的最佳方式是什么?

    然后将模型与控制器同步的最佳方法是什么?

    实现所有4个步骤的任何示例也将非常有帮助,因为我似乎找不到任何示例。


  • 共2个答案

    匿名用户

    就像我在评论中说的,这个问题一次问了很多,所以为了跟进,这里有一个半成品:http://jsfiddle.net/schawaska/dWcUp/

    这不是100%,但涵盖了您的一些问题。它使用FixtureAdapter。我会在有时间的时候更新它。

    1发出ajax请求从PHP脚本中检索JSON数据

    Ember-Data将为您处理此问题。考虑以下内容:

    window.App = Em.Application.create();
    
    App.Store = DS.Store.extend({
        revision: 12,
        adapter: 'DS.RESTAdapter'
    });
    
    App.Product = DS.Model.extend({
        name: DS.attr('string'),
        imageUrl: DS.attr('string')
    })
    

    上面的代码在您的客户端应用程序中定义了一个数据存储(几乎就像一个ORM)。Ember使用约定优于配置(严重),因此根据配置,此代码希望您的后端与/产品在同一域中具有资源,该资源与GET、POST、PUT和DELETE对话。

    2将该信息插入DataStore模型

    考虑到我上面所说的,通过调用以下之一:

    App.store。查找(应用程序产品)应用程序产品。查找()

    EmberData将通过AJAX以您的资源/产品为目标触发GET请求,如果您说App. Products.fint(1),它将以/产品/1为目标。您的应用商店将使用其适配器和适配器的序列化程序来转换JSON结果并将其数据具体化到您的App.Products模型中。

    3将这些模型存储在控制器中

    这是在定义您的应用程序路由器时完成的。无论您做什么,Ember都会运行自己的工作流,但它为您提供了几个挂钩,让您可以控制该特定操作。考虑以下内容:

    App.Router.map(function() {
      this.resource('products');
    });
    
    App.ProductsRoute = Ember.Route.extend({
      model: function() {
        return App.Product.find();
      }
    });
    

    上面的代码填充了产品路由中使用的模型(您将在http://yourdomain.com/#/products访问)。在内部,它将为您的ProductsController生成代码,或者您可以定义自己的代码,它应该扩展ArrayController。控制器将有一个content属性,它是模型或模型集合的别名。同样,约定优于配置。

    4使用带有车把模板的{{#each}}显示信息

    如果您遵循约定,在车把模板中,您应该像这样遍历您的集合:

    {{#each product in controller}}
        {{#linkTo 'product' product}}
            {{product.name}}
        {{/linkTo}}
    {{/each}}
    
    • enpeer-data是否有内置的检索数据的方式?如果没有,AJAX请求应该在哪里实现?

    是的,只需为产品模型调用App. Product.find(),它会在向后端的产品资源发出AJAX请求时返回一个空白的ModelArray,然后在从服务器接收到数据后将数据具体化/填充到每个模型中。

    • 将JSON数据插入DS模型的最佳方法是什么?

    如果您使用的是emer-data,您不应该担心这个问题。在大多数情况下,框架会为您做到这一点。这就是我们喜欢它的原因。但是,您可能必须根据您的后端配置映射、命名空间和复数。

    • 然后将模型与控制器同步的最佳方法是什么?

    类似这样的东西:

    var product = App.Product.createRecord({
        name: 'laptop',
        imageUrl: 'path/to/image.png'
    });
    product.save();
    

    这应该会向后端API发出POSTPUT请求。

    您绝对应该检查:

    http://emberjs.com/guides/

    https://peepcode.com/products/emberjs

    http://toranbillups.com/blog/archive/2013/01/03/Intro-to-ember-js-and-the-new-router-api/

    匿名用户

    发出AJAX请求

    // Find all pets.
    var pets = App.Pet.find();
    
    // Find pet with ID of 1.
    var pet = App.Pet.find(1);
    

    进入数据存储模型

    上面的宠物将是一个DS. RecordArray,包含许多App.Pet模型,而宠物只是一个App.Pet

    存储在控制器

    App.IndexRoute = Ember.Route.extend({
       model: function() {
           return App.Pet.find(4);
       } 
    });
    

    路由器用于设置控制器,因此我们在这里指定IndexController应该容纳一个ID为4的App.Pet。这当然可以是动态的。由于您的控制器只代表一种型号,它应该是ObjectController类型,但是如果它用于存储许多宠物,那么它应该是ArrayController类型。

    通过指定模型,您将可以在IndexController和索引视图(data-tempt-name="index")中访问它。这是因为当您移动到索引路由时,IndexController被定位/实例化,IndexView被实例化并放置到DOM中,所有这些都是在咨询IndexRoute设置控制器之后进行的。

    您现在可以在模板中执行类似的操作(尽管model.不是必需的):{{model.name}},它将为您获取宠物的名字。

    使用#each显示

    使用上述代码的修改版本查找您的所有宠物,但返回所有宠物。请记住,这是通过不指定find方法的参数来完成的:

    App.IndexRoute = Ember.Route.extend({
       model: function() {
           return App.Pet.find();
       }
    });
    

    现在我们可以遍历索引模板中的所有宠物。虽然有很多方法可以循环,例如包含内容。/模型。,不包括. content/模型,使用this控制器等等…,这不是必需的,但那是另一天。目前重要的是这将为您工作,并且将是最直观的:

    {{#each pet in controller}}
        {{pet.name}}
    {{/each}}
    

    如果你愿意,我会为此准备一个jsFiddle。请告诉我。

    问题

    enpe-data是否有内置的检索数据的方式?如果没有,应该在哪里实现AJAX请求?

    是的,那是Ember Data模块,它有一些关于EmberJS.com的好指南。

    将JSON数据插入DS模型的最佳方式是什么?

    根据上面的示例使用Ember数据。

    然后将模型与控制器同步的最佳方法是什么?

    在适当的路由中使用model挂钩来指定控制器代表的模型。