从成员数据模型上的关系访问属性



我正在开发一个像社交网络这样的小型应用程序来管理项目。现在,我正在网络上处理友谊关系。为此,我创建了一个名为"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>的字符串。访问此内容的正确方式是什么?它应该在控制器上、在路线上完成吗?我应该创建一个额外的视图或类似的东西吗?

事先非常感谢你的帮助。


编辑

我已经添加了@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>

输出

朋友

<person1>,来自<位置1>。他/她的朋友是<<DS.ManyArray:ember360>>
<person2>,来自<位置2>。他/她的朋友是<<DS.ManyArray:ember361>>
<person3>,来自<place3>。他/她的朋友是<<DS.ManyArray:ember362>>

顺便说一句,我一直在努力让一些东西发挥作用,它确实有效,但我确信这不是最佳解决方案,可能也不是一个好的做法。当然不是适用于所有情况:

friends: function()
{
  var model = this.get('model');
  var friendsList = model.get('friends').mapProperty('name');
  return friendsList;
}.property('model.friends'),

首先需要在路线中设置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");
});

更新

视图中如何使用hasMany关系的简单示例http://jsfiddle.net/Mwg89/10/

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')
})

最新更新