【问题标题】:Ember-data: "no model found" while it's thereEmber-data:“找不到模型”,而它在那里
【发布时间】:2013-12-31 11:56:08
【问题描述】:

我正在尝试从 RESTful 后端获取模型数据。这适用于模型“项目”,而对于模型“运河”,我只会在控制台中收到一条错误消息:

断言失败:加载路由时出错:错误:未找到模型 对于'0'

使用 curl 测试 API 效果很好。

router.js:

App.Router.map(function() {
    this.route("start", { path: "/" });
    this.route("projects", { path: "/projects" });
    this.route("canals", { path: "/canals" });
});


App.ProjectsRoute = Ember.Route.extend({
    model: function() {
        return this.store.find('project');
    }
});

App.CanalsRoute = Ember.Route.extend({
    model: function() {
        return this.store.find('canal');
    }
});

models.js

App.Project = DS.Model.extend({
    title: DS.attr('string'),
    client: DS.attr('string'),
    comment: DS.attr('string'),
    project_number: DS.attr('string')
});

App.Canal = DS.Model.extend({
    pid:  DS.attr('number'),
    street: DS.attr('string'), 
    district: DS.attr('string'), 
    upper_inspection_point: DS.attr('string'), 
    lower_inspection_point: DS.attr('string'), 
    type: DS.attr('string'), 
    direction: DS.attr('string'), 
    profile: DS.attr('string'), 
    height: DS.attr('string'), 
    width: DS.attr('string'), 
    material: DS.attr('string'), 
    branch: DS.attr('number'), 
    length: DS.attr('number'),
    demolition_class: DS.attr('number'),
    date: DS.attr('date'),
    comment: DS.attr('string')
});

app.js

window.App = Ember.Application.create();
App.Store = DS.Store.extend({
    adapter: DS.RESTAdapter,
});
DS.RESTAdapter.reopen({
  namespace: 'api/index.php'
});

依赖项/版本

DEBUG: ------------------------------- ember-1.2.0.js:3231
DEBUG: Ember      : 1.2.0 ember-1.2.0.js:3231
DEBUG: Ember Data : 1.0.0-beta.5+canary.e1200068 ember-1.2.0.js:3231
DEBUG: Handlebars : 1.1.2 ember-1.2.0.js:3231
DEBUG: jQuery     : 2.0.3 ember-1.2.0.js:3231
DEBUG: ------------------------------- ember-1.2.0.js:3231
Ember Debugger Active 

编辑 看起来,后端 (SlimPHP) 提供了不兼容的 JSON 响应 (http://jsfiddle.net/hk2ph/)。我将 fetchAll() 更新为 fetchAll(PDO::FETCH_ASSOC) 但我仍然得到编号索引:

$sql = "SELECT * FROM canals WHERE pid = :pid";
        try {
            $db = getConnection();
            $stmt = $db->prepare($sql);
            $stmt->bindParam(":pid", $pid);
            $stmt->execute();
            $canals = $stmt->fetchAll(PDO::FETCH_ASSOC);
            $db = null;
            header("Content-Type: application/json");
            echo json_encode($canals);
            exit;
        } catch(PDOException $e) {
            echo '{"error":{"text":'. $e->getMessage() .'}}';
            header("Content-Type: application/json");
            exit;
        }

【问题讨论】:

标签: javascript php rest ember.js ember-data


【解决方案1】:

这是你的 json,它返回一个属性,让 ember 数据认为有一个类型 0,有点像这样:

{
  canals:[
    {
      // stuff
    }],
  0: [
   {

   }]
}

【讨论】:

  • 你是对的。我使用 PDO::fetchAll 从数据库中获取数据,这会产生一个带有数字和命名索引的数组编辑:示例可以在这里找到:jsfiddle.net/hk2ph
  • 如果你不想在服务器端修复它,你可以通过使用自定义序列化程序并覆盖extractArray github.com/emberjs/data/blob/master/TRANSITION.md来修改json客户端
  • 我已经尝试按照原帖编辑中的描述修复服务器端。但似乎 PDO::FEtCH_ASSOC ist 也不适用我的设置。我会试试你的灵魂
【解决方案2】:

构建 JSON 的正确样式是:

$canals = $stmt->fetchAll(PDO::FETCH_ASSOC);

现在一切正常,感谢支持!

【讨论】:

    【解决方案3】:

    检查您的 JSON api 响应的结构是否符合 ember-data 的要求。您应该提供如下结构的所有资源数据:

    {
      "items": [
        {
          "id": 0,
          "title": "foo"
        },
        {
          "id": 1,
          "title": "bar"
        }
      ]
    }
    

    来源: Ember 1.0.0 RESTAdapter failure

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2020-04-10
      • 2014-04-24
      • 2022-01-08
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      相关资源
      最近更新 更多