ember-数据:很难将数据放入商店
ember-data: having a hard time getting data into the store
我有一个在服务器端构建的现有搜索应用程序,它使用由 python/flask 处理的 elasticsearch。在客户端,它使用 JS/jQuery 和 handlebars 来解析和呈现数据。
我想更进一步并在 ember 中构建它,因为 "controls"(过滤器、排序、分页等)使其成为 SPA 的完美候选者。
我了解 ember 的基本原理,但我觉得我在 ember-data 方面遇到了瓶颈 - 即如何将我的数据放入商店以便我可以绑定操作。有人能指出我正确的方向吗?
我现有的 JSON API 是这样访问的:
http://localhost:8000/search?q=shirt&paging=18&filter-price=100
它 returns JSON 像这样:
{
"aggregations": {
"breadcrumb": [],
"color": [],
"price": [],
"size_apparel": [],
"size_jewelry": []
},
"meta": {
"agg_list": [],
"default_sort": "",
"key_translations": {},
"paging": 18,
"paging_options": [],
"sort_methods": [],
"from": 0,
"hits": 89,
"pages": 5,
"q": "shirt"
},
"results": [
{
"creation_date": "",
"image": "",
"images": {
"altimg1": "",
"large": "",
"regular": "/",
"small": ""
},
"name": "This Product",
"price": "19.95",
"skuid": "ABC123",
"url": "shirt.html"
},
{...},
{...}
]
}
这个可以用还是我需要重写后端??我已经修改了访问数据的方法,并且工作起来非常粗糙。我实际上可以看到 'results' 数据,但我不知道如何访问 'meta' 和 'aggregations' 数据。我 认为 这是 "multiple models in the sam payload" 并且 RSVP.hash 应该可以工作...但是 ember-data 似乎要求每个模型都有一个 id。这对 "results" 模型有意义,但对聚合和元数据绝对不是。
现在我只想让它出现。
首先,我的适配器是:
export default DS.RESTAdapter.extend({
host: 'http://localhost:8000',
pathForType() {
return 'search';
}
});
测试控制器是:
export default Ember.Controller.extend({
queryParams: ['q','paging'],
q: 'shirt',
paging: '18'
});
我的 'result' 型号是:
const { attr } = DS;
export default Model.extend({
'creation_date': attr('string'),
'has_pricerange': attr('string'),
'image': attr('string'),
'name': attr('string'),
'price': attr('string'),
'skuid': attr('string'),
'url': attr('string')
});
路线:
export default Ember.Route.extend({
model(params) {
return this.store.query('result', {
q: params.q,
paging: params.paging
});
}
});
序列化器:
export default DS.RESTSerializer.extend({
primaryKey: 'skuid'
});
使用 jquery 很容易做到这一点 - 您只需 $.get 然后使用对象表示法访问数据。我知道 ember 不是 jquery,但它似乎应该更容易访问数据。我错过了什么吗?采取错误的方法?我应该从头开始吗?
我建议您阅读指南的 this section,特别是关于 $.getJSON
的内容。 Ember 旨在使用功能强大的商店。如果您使用标准 api(例如 JSON API),使用起来会容易得多;你可以直接使用 Ember 数据代码。但如果没有,您将不得不编写一些序列化程序代码,以便 Ember 知道如何使用您的 api。一旦完成,您的组件代码将不会耦合到您的数据获取代码。
不过,如果您仍在制作原型,您可以使用 $.getJSON。
Ember 数据是 Ember 拼图的重要组成部分,但绝不是必需的。您是否应该使用 Ember 数据实际上取决于您的数据的性质、您对 API 的控制以及您期望的未来保障能力
您数据的性质
Ember 数据确实优于典型的 model/entity 类型数据。 "Things" 具有属性,并且可以相互关联。如果您的数据遵循该模式,那么 Ember 数据可能非常合适。
控制你的API
正如另一个答案中提到的,如果您可以购买 JSON API 格式,您将免费获得很多东西。这已成为 Ember 数据的标准,但并非 Ember 独有。许多 server-side 选项都可以使用 many existing frameworks 轻松序列化这些资源。如果您无法更改来自服务器的数据,或者仅在 front-end 上处理它更容易,您可以沿着自定义 Ember 中的 adapters/serializers 的路径前进。
期望的未来保障能力
Ember 数据允许您更换 adapter/serializer,同时保持您的模型完好无损。如果您希望您的应用程序将来处理不同的来源,那么这是可取的,可能会从使用您自己的 API 切换到使用本地存储,或像 firebase 这样的第三方服务。如果不打算进行太多更改,您可以进行基本的 ajax 调用和 return 在 model
挂钩中的承诺,并且 Ember 的工作方式大致相同。我建议使用 ember-network
,它是针对 fetch
API 指定的,并且作为 FastBoot
兼容请求可能会得到越来越多的支持。
其他需要考虑的事情是 Ember 数据和使用 Ember 对象可能很繁重,具体取决于您将传入的每个模型的实例数量。
其他人也在解决这个问题。 Toran Billups 已经通过 ember-redux
提取了 redux 模式,这是另一种思考如何处理数据的好方法。
您的用例
所以你可以:
使用 Ember 数据与 find
看看您的数据的形状,您似乎提供了更多的搜索服务,而不是查询特定 models/entities。 Ember Data 确实有一个 find
方法,但是您提供的元数据的数量对于模型用例来说可能会过载。
忘记Ember数据并使用搜索终点
model: function(params)
,使用model hook中的params构造url到搜索终点,return一个promise(根据需要添加then
塑造数据)
查询搜索终点(API重构)
与上述类似的想法,但您将使用获取产品 ID 并使用它们来查询产品的 ember 数据存储。
类似于:
fetch("service-end-point?with=queryparams")
.then(result => {
return {
products: this.store.findMany(Product, result.ids);
};
});
我认为直接在控制器中处理和调整数据并跳过 Ember 数据是最容易开始的。如果你想要特定的计算 属性 绑定,你没有理由可以用你想要的形状扩展 Ember.Object 然后使用类似 .map
的东西从网络请求中获取结果并应用它payload => Object.create(payload)
.
如果您对这些想法有任何疑问,请告诉我。
我有一个在服务器端构建的现有搜索应用程序,它使用由 python/flask 处理的 elasticsearch。在客户端,它使用 JS/jQuery 和 handlebars 来解析和呈现数据。
我想更进一步并在 ember 中构建它,因为 "controls"(过滤器、排序、分页等)使其成为 SPA 的完美候选者。
我了解 ember 的基本原理,但我觉得我在 ember-data 方面遇到了瓶颈 - 即如何将我的数据放入商店以便我可以绑定操作。有人能指出我正确的方向吗?
我现有的 JSON API 是这样访问的:
http://localhost:8000/search?q=shirt&paging=18&filter-price=100
它 returns JSON 像这样:
{
"aggregations": {
"breadcrumb": [],
"color": [],
"price": [],
"size_apparel": [],
"size_jewelry": []
},
"meta": {
"agg_list": [],
"default_sort": "",
"key_translations": {},
"paging": 18,
"paging_options": [],
"sort_methods": [],
"from": 0,
"hits": 89,
"pages": 5,
"q": "shirt"
},
"results": [
{
"creation_date": "",
"image": "",
"images": {
"altimg1": "",
"large": "",
"regular": "/",
"small": ""
},
"name": "This Product",
"price": "19.95",
"skuid": "ABC123",
"url": "shirt.html"
},
{...},
{...}
]
}
这个可以用还是我需要重写后端??我已经修改了访问数据的方法,并且工作起来非常粗糙。我实际上可以看到 'results' 数据,但我不知道如何访问 'meta' 和 'aggregations' 数据。我 认为 这是 "multiple models in the sam payload" 并且 RSVP.hash 应该可以工作...但是 ember-data 似乎要求每个模型都有一个 id。这对 "results" 模型有意义,但对聚合和元数据绝对不是。
现在我只想让它出现。
首先,我的适配器是:
export default DS.RESTAdapter.extend({
host: 'http://localhost:8000',
pathForType() {
return 'search';
}
});
测试控制器是:
export default Ember.Controller.extend({
queryParams: ['q','paging'],
q: 'shirt',
paging: '18'
});
我的 'result' 型号是:
const { attr } = DS;
export default Model.extend({
'creation_date': attr('string'),
'has_pricerange': attr('string'),
'image': attr('string'),
'name': attr('string'),
'price': attr('string'),
'skuid': attr('string'),
'url': attr('string')
});
路线:
export default Ember.Route.extend({
model(params) {
return this.store.query('result', {
q: params.q,
paging: params.paging
});
}
});
序列化器:
export default DS.RESTSerializer.extend({
primaryKey: 'skuid'
});
使用 jquery 很容易做到这一点 - 您只需 $.get 然后使用对象表示法访问数据。我知道 ember 不是 jquery,但它似乎应该更容易访问数据。我错过了什么吗?采取错误的方法?我应该从头开始吗?
我建议您阅读指南的 this section,特别是关于 $.getJSON
的内容。 Ember 旨在使用功能强大的商店。如果您使用标准 api(例如 JSON API),使用起来会容易得多;你可以直接使用 Ember 数据代码。但如果没有,您将不得不编写一些序列化程序代码,以便 Ember 知道如何使用您的 api。一旦完成,您的组件代码将不会耦合到您的数据获取代码。
不过,如果您仍在制作原型,您可以使用 $.getJSON。
Ember 数据是 Ember 拼图的重要组成部分,但绝不是必需的。您是否应该使用 Ember 数据实际上取决于您的数据的性质、您对 API 的控制以及您期望的未来保障能力
您数据的性质
Ember 数据确实优于典型的 model/entity 类型数据。 "Things" 具有属性,并且可以相互关联。如果您的数据遵循该模式,那么 Ember 数据可能非常合适。
控制你的API
正如另一个答案中提到的,如果您可以购买 JSON API 格式,您将免费获得很多东西。这已成为 Ember 数据的标准,但并非 Ember 独有。许多 server-side 选项都可以使用 many existing frameworks 轻松序列化这些资源。如果您无法更改来自服务器的数据,或者仅在 front-end 上处理它更容易,您可以沿着自定义 Ember 中的 adapters/serializers 的路径前进。
期望的未来保障能力
Ember 数据允许您更换 adapter/serializer,同时保持您的模型完好无损。如果您希望您的应用程序将来处理不同的来源,那么这是可取的,可能会从使用您自己的 API 切换到使用本地存储,或像 firebase 这样的第三方服务。如果不打算进行太多更改,您可以进行基本的 ajax 调用和 return 在 model
挂钩中的承诺,并且 Ember 的工作方式大致相同。我建议使用 ember-network
,它是针对 fetch
API 指定的,并且作为 FastBoot
兼容请求可能会得到越来越多的支持。
其他需要考虑的事情是 Ember 数据和使用 Ember 对象可能很繁重,具体取决于您将传入的每个模型的实例数量。
其他人也在解决这个问题。 Toran Billups 已经通过 ember-redux
提取了 redux 模式,这是另一种思考如何处理数据的好方法。
您的用例
所以你可以:
使用 Ember 数据与 find
看看您的数据的形状,您似乎提供了更多的搜索服务,而不是查询特定 models/entities。 Ember Data 确实有一个 find
方法,但是您提供的元数据的数量对于模型用例来说可能会过载。
忘记Ember数据并使用搜索终点
model: function(params)
,使用model hook中的params构造url到搜索终点,return一个promise(根据需要添加then
塑造数据)
查询搜索终点(API重构)
与上述类似的想法,但您将使用获取产品 ID 并使用它们来查询产品的 ember 数据存储。
类似于:
fetch("service-end-point?with=queryparams")
.then(result => {
return {
products: this.store.findMany(Product, result.ids);
};
});
我认为直接在控制器中处理和调整数据并跳过 Ember 数据是最容易开始的。如果你想要特定的计算 属性 绑定,你没有理由可以用你想要的形状扩展 Ember.Object 然后使用类似 .map
的东西从网络请求中获取结果并应用它payload => Object.create(payload)
.
如果您对这些想法有任何疑问,请告诉我。