从ember-data模型的关系访问属性

时间:2013-06-21 18:15:01

标签: model controller ember.js relationship ember-data

我正在开发一个像社交网络这样的小应用程序来管理项目。现在,我正在研究网络上的友谊关系。为此,我创建了一个名为“Person”的模型,其中包含下一个属性:

App.Person = DS.Model.extend
(
   {
      name: DS.attr('string'),
      place: DS.attr('string'),
      email: DS.attr('string'),
      password: DS.attr('string'),
      academic: DS.attr('string'),
      professional: DS.hasMany('App.Work'),
      knowledge: DS.attr('string'),
      projects: DS.hasMany('App.Project'),
      friends: DS.hasMany('App.Person')
   }
);

现在,我正在尝试获取控制器中某个人的朋友列表,但我不知道如何访问它。尝试this.get('model').get('friends')之类的内容会在模板中显示类似<DS.ManyArray:ember358>的字符串。访问这个的正确方法是什么?如果它在Controller上完成,在Route上,我应该创建一个额外的View或类似的东西吗?

非常感谢您的帮助。


修改

我已经添加了@ArturMalecki所说的确切内容,但我得到了<DS.ManyArray:ember360>。这就是我所拥有的:

人员控制器

App.PersonController = Ember.ObjectController.extend
(
  {
    friends: function() 
    {
      return this.get('model').get('friends');
    }.property('model.friends'),
  }
);

路由器

App.Router.map
(
  function()
  {
    this.resource('app', { path: '/' }, function ()
    {
      // Additional child routes
      this.route('friends');
      ...
    });
    this.resource('person');
  }
);

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

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

把手模板

<script type="text/x-handlebars" data-template-name="app/friends">
  <h1>Friends</h1>
  <ul>
    {{#each model itemController="person"}}
      <li>{{name}}, from {{place}}. Him/her friends are <{{friends}}>
    {{else}}
      You've no still friends
    {{/each}}
  </ul>
</script>

输出

  

     

&lt; person1 &gt;,来自&lt; place1 &gt;。他/她的朋友是&lt; <DS.ManyArray:ember360>&gt;   &lt; person2 &gt;,来自&lt; place2 &gt;。他/她的朋友是&lt; <DS.ManyArray:ember361>&gt;   &lt; person3 &gt;,来自&lt; place3 &gt;。他/她的朋友是&lt; <DS.ManyArray:ember362>&gt;

顺便说一下,我一直试图让某些东西起作用,它确实有效,但我确信它不是最佳解决方案,也许这也不是一个好习惯。当然不适用于所有情况:

friends: function()
{
  var model = this.get('model');

  var friendsList = model.get('friends').mapProperty('name');

  return friendsList;
}.property('model.friends'),

1 个答案:

答案 0 :(得分:1)

首先在路线中设置model。假设您有PersonRoutePersonController

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

然后您可以通过以下方式访问控制器中的friends属性:

App.PersonController = Ember.ObjectController.extend({
  someCustomMethod: function() {
    ...
    this.get('model').get('friends');
    ...
  },
})

请记住,您需要在路线中添加人员:

App.Router.map(function() {
 this.resource("person");
});

更新

如何在视图http://jsfiddle.net/Mwg89/10/

中使用hasMany关系的简单示例

HTML

<script type="text/x-handlebars" data-template-name="application">
    {{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
    {{#each friend in friends}}
      {{friend.name}}
    {{/each}}
    <hr/>
    {{#each friend in model.friends}}
      {{friend.name}}
    {{/each}}
</script>

JS

App = Ember.Application.create({});

App.Store = DS.Store.extend({
    revision: 12,
    adapter: 'DS.FixtureAdapter'
});

App.Person = DS.Model.extend({
    name: DS.attr('string'),
    friends: DS.hasMany('App.Person'),
});

App.Person.FIXTURES = [
    { id: 1, name: 'Person1', friends: [2,3] },
    { id: 2, name: 'FriendPerson1' },
    { id: 3, name: 'FreindPerson2' }

];

App.IndexRoute = Ember.Route.extend({
    model: function() {
        return App.Person.find(1);
    }
});

App.IndexController = Ember.ObjectController.extend({
    friends: function() {
        return this.get('model').get('friends');
    }.property('model.friends')
})