Javascript 在Ember JS+;余烬数据

Javascript 在Ember JS+;余烬数据,javascript,ember.js,ember-data,ember-cli,Javascript,Ember.js,Ember Data,Ember Cli,我正在尝试创建一个包含几个动态页面的简单应用程序:索引、关于和联系人。我不想在路由器中硬编码路由;用户无需编辑路由器即可添加页面。我从Ember cli开始 我在网上找到了一个简要介绍此任务的教程:。不幸的是,在使用余烬数据时,我遇到了两个主要问题: this.store.find(“page”,params[“page_id]”)返回san阵列,而不是对象。它实际上不是为检索单个对象而设计的 路由上的序列化函数从未被调用 适配器 import DS from 'ember-data'; ex

我正在尝试创建一个包含几个动态页面的简单应用程序:索引、关于和联系人。我不想在路由器中硬编码路由;用户无需编辑路由器即可添加页面。我从Ember cli开始

我在网上找到了一个简要介绍此任务的教程:。不幸的是,在使用余烬数据时,我遇到了两个主要问题:

  • this.store.find(“page”,params[“page_id]”)返回san阵列,而不是对象。它实际上不是为检索单个对象而设计的

  • 路由
    上的
    序列化
    函数从未被调用

  • 适配器

    import DS from 'ember-data';
    
    export default DS.FixtureAdapter.extend({
        queryFixtures: function(fixtures, query, type) {
            var key = Ember.keys(query)[0];
            return fixtures.filterBy(key, query[key]); //This must be an array, not an object.
        }
    });
    
    模型

    路由器

    import Ember from 'ember';
    import config from './config/environment';
    
    var Router = Ember.Router.extend({
      location: config.locationType
    });
    
    Router.map(function() {
        this.resource("page", {"path": "/:page_id"});
    });
    
    export default Router;
    
    路线(第页)

    模板

    {{title}} //Must be wrapped in {{#each}} in order to loop through the array of a single object
    
    我真正做到这一点的唯一方法是将整数
    id
    更改为与URL匹配的字符串。这种方法感觉像是在破坏模型;我认为这不是正确的方法。

    find()
    如果第二个参数是对象,则应始终返回一个数组,然后调用
    findQuery()
    。这并不重要,尽管你可以得到第一个,并在新的承诺中返还:

    export default Ember.Route.extend({
        model: function(params) {
            var query = this.store.find("page", { path: params.page_id });
    
            var promise = new Ember.RSVP.Promise(function(resolve, reject) {
               query.then(function(result) {
                   resolve(result.get('firstObject'));
               },
               function(err) {
                   reject(err);
               });
            });
            return promise;
        },
    });
    

    调用serialize只是为了从模型中获取参数,所以只能在类似
    {{link to'page'}

    this.store.find(“page”,params[“page_id”])这样的事情上进行不应该返回数组。我的错误。我粘贴了错误的代码片段。
    this.store.find()
    无法通过
    id
    进行搜索。相反,它必须通过一个参数进行搜索,在本例中是
    path
    。我更新了代码片段以反映这一点。我得到以下错误:处理路由时出错:page必须将解析程序函数作为第一个参数传递给承诺构造函数TypeError:必须将解析程序函数作为第一个参数传递给承诺构造函数TypeErrorconstructor@Jason啊,基本上你已经知道了,所以
    this.store.find(“page”,{path:params.page_id})
    将始终返回一个数组,因此您可以返回第一个对象(您一直期望的对象),我已更新了我的答案。@Jason哇,这让我对旧的余烬感到困惑。延迟语法,当动态段占位符为“page\u id”时,请在相关注释中再次检查答案,这是否指示Ember自动查找模型
    页面
    和属性
    id
    {{title}} //Must be wrapped in {{#each}} in order to loop through the array of a single object
    
    export default Ember.Route.extend({
        model: function(params) {
            var query = this.store.find("page", { path: params.page_id });
    
            var promise = new Ember.RSVP.Promise(function(resolve, reject) {
               query.then(function(result) {
                   resolve(result.get('firstObject'));
               },
               function(err) {
                   reject(err);
               });
            });
            return promise;
        },
    });