【问题标题】:Access to attributes from relationship on ember-data models从 ember-data 模型的关系中访问属性
【发布时间】:2013-06-21 18:15:00
【问题描述】:

我正在开发一个像社交网络这样的小型应用程序来管理项目。现在,我正在研究网络上的友谊关系。为此,我创建了一个名为“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'),

【问题讨论】:

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


    【解决方案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')
    })
    

    【讨论】:

    • 我已经尝试过你的建议g,但我得到了相同的结果@Artur。我已经更新了显示代码当前状态的原始问题。非常感谢您的帮助。
    • 嗨@DanielRodriguezMolina 我刚刚做了一个简单的例子,你可以如何访问DS.ManyArrayjsfiddle.net/Mwg89/4
    • 优秀@ArturMalecki!我一直在尝试您的解决方案,并且效果很好!非常感谢,你拯救了我的一周!只是一个小细节...您不认为将friends: function{...}.property('model.friends') 放在属性的末尾会很好吗?在friends 更改的情况下更新结果。再次感谢您!
    • 不客气。你是对的function{...}.property('model.friends')。我刚刚更新了我的示例,并添加了访问hasMany 关系的第二种方式。
    • 小提琴似乎没有产生任何输出。你能检查一下@ArturMałecki 并发布更新吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2015-04-12
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多