2

我正在开发一个像社交网络这样的小型应用程序来管理项目。现在,我正在研究网络上的友谊关系。为此,我创建了一个名为“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 >,来自< place1 >。他/她的朋友是< <DS.ManyArray:ember360>>
< person2 >,来自< place2 >。他/她的朋友是< <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'),
4

1 回答 1

1

首先在您的路线中,您需要设置model. 让我们假设你有PersonRoute并且PersonController

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')
})
于 2013-06-21T18:41:50.093 回答