Ember.js 显示所属产品类别
我呈现了一个Ember.js 显示所属产品类别,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,我呈现了一个产品表,其中应包括每个产品的类别,但不包括 模板代码: app/templates/products/index.hbs [...] <tbody> {{#each product in model}} <tr> <td> {{product.name}} </td> <td> {{product.category.name}} &
产品
表,其中应包括每个产品的类别
,但不包括
模板代码:
app/templates/products/index.hbs
[...]
<tbody>
{{#each product in model}}
<tr>
<td>
{{product.name}}
</td>
<td>
{{product.category.name}}
</td>
[...]
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
'namespace': 'api'
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
category: DS.belongsTo('category', { async: true })
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
products: DS.hasMany('product')
});
module.exports = function(app) {
var express = require('express');
var productsRouter = express.Router();
productsRouter.get('/', function(req, res) {
res.send({
'products': [
{"id":1,"name":"Orange","category":1},
{"id":2,"name":"Banana","category":1},
{"id":3,"name":"Potato","category":2}
]
});
});
[...]
module.exports = function(app) {
var express = require('express');
var categoriesRouter = express.Router();
categoriesRouter.get('/', function(req, res) {
res.send({
'categories': [
{"id":1,"name":"Fruits","products:":[1,2]},
{"id":2,"name":"Vegetables","products:":[3]}
]
});
});
[...]
app/adapters/application.js
[...]
<tbody>
{{#each product in model}}
<tr>
<td>
{{product.name}}
</td>
<td>
{{product.category.name}}
</td>
[...]
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
'namespace': 'api'
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
category: DS.belongsTo('category', { async: true })
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
products: DS.hasMany('product')
});
module.exports = function(app) {
var express = require('express');
var productsRouter = express.Router();
productsRouter.get('/', function(req, res) {
res.send({
'products': [
{"id":1,"name":"Orange","category":1},
{"id":2,"name":"Banana","category":1},
{"id":3,"name":"Potato","category":2}
]
});
});
[...]
module.exports = function(app) {
var express = require('express');
var categoriesRouter = express.Router();
categoriesRouter.get('/', function(req, res) {
res.send({
'categories': [
{"id":1,"name":"Fruits","products:":[1,2]},
{"id":2,"name":"Vegetables","products:":[3]}
]
});
});
[...]
app/models/product.js
[...]
<tbody>
{{#each product in model}}
<tr>
<td>
{{product.name}}
</td>
<td>
{{product.category.name}}
</td>
[...]
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
'namespace': 'api'
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
category: DS.belongsTo('category', { async: true })
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
products: DS.hasMany('product')
});
module.exports = function(app) {
var express = require('express');
var productsRouter = express.Router();
productsRouter.get('/', function(req, res) {
res.send({
'products': [
{"id":1,"name":"Orange","category":1},
{"id":2,"name":"Banana","category":1},
{"id":3,"name":"Potato","category":2}
]
});
});
[...]
module.exports = function(app) {
var express = require('express');
var categoriesRouter = express.Router();
categoriesRouter.get('/', function(req, res) {
res.send({
'categories': [
{"id":1,"name":"Fruits","products:":[1,2]},
{"id":2,"name":"Vegetables","products:":[3]}
]
});
});
[...]
app/models/category.js
[...]
<tbody>
{{#each product in model}}
<tr>
<td>
{{product.name}}
</td>
<td>
{{product.category.name}}
</td>
[...]
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
'namespace': 'api'
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
category: DS.belongsTo('category', { async: true })
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
products: DS.hasMany('product')
});
module.exports = function(app) {
var express = require('express');
var productsRouter = express.Router();
productsRouter.get('/', function(req, res) {
res.send({
'products': [
{"id":1,"name":"Orange","category":1},
{"id":2,"name":"Banana","category":1},
{"id":3,"name":"Potato","category":2}
]
});
});
[...]
module.exports = function(app) {
var express = require('express');
var categoriesRouter = express.Router();
categoriesRouter.get('/', function(req, res) {
res.send({
'categories': [
{"id":1,"name":"Fruits","products:":[1,2]},
{"id":2,"name":"Vegetables","products:":[3]}
]
});
});
[...]
server/mocks/products.js
[...]
<tbody>
{{#each product in model}}
<tr>
<td>
{{product.name}}
</td>
<td>
{{product.category.name}}
</td>
[...]
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
'namespace': 'api'
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
category: DS.belongsTo('category', { async: true })
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
products: DS.hasMany('product')
});
module.exports = function(app) {
var express = require('express');
var productsRouter = express.Router();
productsRouter.get('/', function(req, res) {
res.send({
'products': [
{"id":1,"name":"Orange","category":1},
{"id":2,"name":"Banana","category":1},
{"id":3,"name":"Potato","category":2}
]
});
});
[...]
module.exports = function(app) {
var express = require('express');
var categoriesRouter = express.Router();
categoriesRouter.get('/', function(req, res) {
res.send({
'categories': [
{"id":1,"name":"Fruits","products:":[1,2]},
{"id":2,"name":"Vegetables","products:":[3]}
]
});
});
[...]
server/mocks/categories.js
[...]
<tbody>
{{#each product in model}}
<tr>
<td>
{{product.name}}
</td>
<td>
{{product.category.name}}
</td>
[...]
import DS from 'ember-data';
export default DS.RESTAdapter.extend({
'namespace': 'api'
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
category: DS.belongsTo('category', { async: true })
});
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
products: DS.hasMany('product')
});
module.exports = function(app) {
var express = require('express');
var productsRouter = express.Router();
productsRouter.get('/', function(req, res) {
res.send({
'products': [
{"id":1,"name":"Orange","category":1},
{"id":2,"name":"Banana","category":1},
{"id":3,"name":"Potato","category":2}
]
});
});
[...]
module.exports = function(app) {
var express = require('express');
var categoriesRouter = express.Router();
categoriesRouter.get('/', function(req, res) {
res.send({
'categories': [
{"id":1,"name":"Fruits","products:":[1,2]},
{"id":2,"name":"Vegetables","products:":[3]}
]
});
});
[...]
您应该将
belongsTo
定义为异步:
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
category: DS.belongsTo('category', { async: true })
});
这将对您访问的每个类别执行GET请求
或者你也可以把产品放在一边
看看这个,它表明它可以工作
如果查看模拟服务器,您将看到以下路径:
categoriesRouter.get('/:id', function(req, res) {
res.send({
'categories': {
id: req.params.id
}
});
});
正如您所见,当您请求category
1时,它将返回一个只有该id的对象
所以添加{async:true}
会根据类别
向/category/1
发出请求(当然是类别1)。您必须确保返回正确的对象
例如:
var categoryList = [
{"id":1,"name":"Fruits","products:":[1,2]},
{"id":2,"name":"Vegetables","products:":[3]}
]
categoriesRouter.get('/:id', function(req, res) {
res.send({
'categories': categoryList.filter(function(c) {
return c.id == req.params.id;
})[0]
});
});
我做了这个改变,但没用。我的代码中还有其他bug吗?我添加了一个jsbin,其中有一个延迟加载的
belongsTo
关系的工作示例。它确实有效。我需要更多的信息。控制台中有任何异常吗?我看不出你发布的代码有任何错误。我更新了代码并添加了显示数据的屏幕截图。类别的名称为“未定义”。我必须发送不同的JSON吗?是的,这是意料之中的。当获取类别的承诺解析时,name
属性将被填充。