这就是我要做的:
>
enpe-data是否有内置的检索数据的方式?如果没有,应该在哪里实现AJAX请求?
将JSON数据插入DS模型的最佳方式是什么?
然后将模型与控制器同步的最佳方法是什么?
实现所有4个步骤的任何示例也将非常有帮助,因为我似乎找不到任何示例。
就像我在评论中说的,这个问题一次问了很多,所以为了跟进,这里有一个半成品: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}}
是的,只需为产品模型调用App. Product.find()
,它会在向后端的产品资源发出AJAX请求时返回一个空白的ModelArray
,然后在从服务器接收到数据后将数据具体化/填充到每个模型中。
如果您使用的是emer-data,您不应该担心这个问题。在大多数情况下,框架会为您做到这一点。这就是我们喜欢它的原因。但是,您可能必须根据您的后端配置映射、命名空间和复数。
类似这样的东西:
var product = App.Product.createRecord({
name: 'laptop',
imageUrl: 'path/to/image.png'
});
product.save();
这应该会向后端API发出POST
或PUT
请求。
您绝对应该检查:
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
挂钩来指定控制器代表的模型。