在EmberJS中构建单一模型

时间:2013-05-11 05:51:52

标签: javascript ember.js ember-data

定义模型和路由以构建可用作应用程序数据的模型的正确方法是什么。

App.Router.map(function(){
    this.resource("main", {path:"/"});
});

App.MainRoute = Ember.Route.extend({
    model:function(){
        return App.Main.find();
    }
});

App.Main = DS.Model.extend({
    appName:DS.attr('string')
});


App.Store = DS.Store.extend({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    namespace: 'api/v1'
  })
});

这最终会调用api/v1/mains。但我希望它调用api/v1/main来返回应用程序数据,这是一个像

这样的单个对象
{
    "appName":"MyApp",
    "lastLogin": "Sat May 11 2013 11:20:03 GMT+0530",
    ...
}

我知道配置复数,但相信这不是正确的方法。 任何帮助,将不胜感激。提前谢谢。

编辑:配置Plurals时,它不是渲染模板

App = Ember.Application.create();

App.Router.map(function(){
    this.resource("main", {path:"/"});
});

App.MainRoute = Ember.Route.extend({
    model:function(){
        return App.Main.find();
    }
});


DS.RESTAdapter.configure("plurals", {
  main: "main"
});

App.Store = DS.Store.extend({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    namespace: 'api/v1'
  })
});

App.Main = DS.Model.extend({
    "appName":DS.attr('string')
});

json从服务器

收到
{
    "main": {
        "app_name": "My App"
    }
}

模板:

<script type="text/x-handlebars" data-template-name="main">
    This is {{appName}}
</script>

2 个答案:

答案 0 :(得分:1)

原始问题在于您调用App.Main.find()这将自动导致为Ember.Arraycontroller content创建MainController(自动生成,因为您的路由命名)。这也会调用请求您的模型的复数版本。

因此,通过将复数修改为指向/ main,您将在显示时检索信息,但仍会在Ember.ArrayController内呈现。因此,要查看此内容,您需要通过{{#each}}运行模板。所以如果你模仿它可能会有效:

<script type="text/x-handlebars" data-template-name="main">
  {{#each main}}
    This is {{appName}}
  {{/each}}
</script>

通过解析find()中的密钥来识别单个记录的解决方案是正确的,因为(正如您已经正确说明的那样)会调用单个(Ember.ObjectController)的创建,然后可以直接讯问。

答案 1 :(得分:0)

不确定这是否是正确的方法,但通过调用

解决了这个问题
App.Main.find("data");

并在服务器端定义路由/api/v1/main/data

因此,App.Main.find("data");的工作方式就像从记录列表中提取单个记录,并为ObjectController生成main