【问题标题】:Display belongsTo category for a product显示产品的 belongsTo 类别
【发布时间】:2015-03-30 16:09:27
【问题描述】:

我在http://localhost:4200/products 渲染了一个product 表,其中应该包括每个产品的category,但没有。

模板代码:

app/templates/products/index.hbs

[...]
<tbody>
  {{#each product in model}}
    <tr>
      <td>
        {{product.name}}
      </td>
      <td>
        {{product.category.name}}
      </td>
[...]

为什么{{product.category.name}} 不显示product.name?我该如何解决?模拟错了吗?

应用程序

ember new shop
cd shop
ember install:addon ember-cli-scaffold
ember g scaffold product name:string
ember g scaffold category name:string
ember g adapter application
ember g http-mock products
ember g http-mock categories

app/adapters/application.js

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  'namespace': 'api'
});

app/models/product.js

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  category: DS.belongsTo('category', { async: true })
});

app/models/category.js

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  products: DS.hasMany('product')
});

server/mocks/products.js

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}
        ]
      });
  });
  [...]

server/mocks/categories.js

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]}
        ]
      });
  });
  [...]

【问题讨论】:

    标签: ember.js ember-data ember-cli


    【解决方案1】:

    您应该将您的 belongsTo 定义为异步:

    import DS from 'ember-data';
    
    export default DS.Model.extend({
      name: DS.attr('string'),
      category: DS.belongsTo('category', { async: true })
    });
    

    这将为您访问的每个类别执行 GET 请求。

    或者您可以将产品侧载到它们。

    看看这个jsbin,它表明它可以工作。

    如果您查看模拟服务器,您会看到这条路线:

    categoriesRouter.get('/:id', function(req, res) {
      res.send({
        'categories': {
          id: req.params.id
        }
      });
    });
    

    正如您所见,当您请求 category 1 时,它会返回一个只有该 ID 的对象。

    所以添加{ async: true } 会根据category/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]
      });
    });
    

    【讨论】:

    • 我做了这个改变,但没有帮助。我的代码中是否还有其他错误?
    • 我添加了一个 jsbin,其中包含一个延迟加载的 belongsTo 关系船的工作示例。它确实有效。我需要更多信息。控制台有异常吗?
    • 我没有发现您发布的代码有任何问题。
    • 我更新了代码并添加了显示数据的屏幕截图。类别的名称是“未定义的”。我必须发送不同的 JSON 吗?
    • 是的,这是意料之中的。 name 属性将在获取类别的承诺解析时填充。
    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多