【问题标题】:How to retrieve model data for use inside of another model?如何检索模型数据以在另一个模型内部使用?
【发布时间】:2015-03-12 16:44:23
【问题描述】:

我正在使用一个通过 Sails.js API 连接到 Rails 后端的 Ember 应用程序,遇到了一个我找不到任何类似示例的问题。

我的 Messages 模型有一个 sender_id 列,它对应于我的 Users 模型中的 id 列。还有一个 Profile 模型(通过 user_id 属于 User),其中包含 username 列,这是我希望能够通过 Messages 模型作为“senderName”访问的(即message.senderName) .我的模型和路线都已连接,因此我可以访问我需要的所有数据,并且除了我的 senderName 函数之外的所有内容都在浏览器中正确显示。

计划是通过 Messages 内部的 user_id(使用 sender_id)查找 Profile 对象,然后从那里拉出 username 字段。我已经能够从我的 Profile 查询中收到 Promises,但是我不确定如何/是否可以访问实际的 username 字段。有没有办法做到这一点,还是我想把一个方形钉子装进一个圆孔里?

我还尝试通过首先查找 User 对象(this.store.find('user') 等)并使用我的 Rails 关联来访问 username,但这也不起作用。

型号:

  App.Message = DS.Model.extend({
    sender_id : DS.attr('number'),
    content : DS.attr('string'),
    senderName: function() {
      var id = this.get('sender_id');
      var profile = this.store.find('profile', {user_id: id}).then(function() {
      console.log(profile);
      // What next? profile.username doesn't work
    })
  }.property('sender_id')
});

App.Profile = DS.Model.extend({
   user: DS.belongsTo('user', { async: true }),
   username : DS.attr('string'),
   user_id : DS.attr('number')
});

App.User = DS.Model.extend({
    profile: DS.belongsTo('profile', { async: true }),
    email: DS.attr('string'),
    name: DS.attr('string')
});

模板:

<script type="text/x-handlebars" data-template-name="messages/index">
    <div class="small-12 column">
        {{#each message in model}}
            <p>From: {{message.senderName}}</p>
            <p>Content: {{message.content}}</p>
        {{/each}}
    </div>
</script>

这是我在浏览器控制台中收到的承诺示例:

Promise {_id: 93, _label: undefined, _state: undefined, _result: undefined, _subscribers: Array[0]…}

感谢您的帮助!

【问题讨论】:

    标签: node.js ember.js sails.js


    【解决方案1】:

    如果我的问题是正确的,您在访问模型中的字段时遇到了问题?如果是这样,请尝试:

    profile.get('username')

    【讨论】:

    • 是的,没错。不过,我尝试了profile.get('username'),但得到了“未捕获的错误:断言失败:TypeError:未定义不是函数”错误作为回报。我想这可能是因为 promise 返回了一个数组,但 profile[0] 返回未定义。
    • 您的代码可能在“配置文件”加载之前正在运行 - 您是否考虑过使用 Promise?查看 Ember.RSVP 的内容。
    • 在您的控制台窗口中进行试验也值得一试 - 可能在模型加载后立即设置一些断点,然后尝试我从那里给您的命令
    【解决方案2】:

    你真的太复杂了:-)

    消息也属于sender,为什么将sender_id定义为数字?

    如果删除senderName 并将sender_id 属性更改为:

    sender: DS.belongsTo('user', { async: true }),
    

    您可以使用message.get('sender.profile.username')。我认为您的主要问题是您试图在计算属性中执行异步操作,这是一个禁忌。如果你愿意,你可以给 senderName 起别名,如果你最终经常使用它,可以通过 senderName: Ember.computed.alias('sender.profile.username') 来别名。

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2018-05-23
      • 2019-09-07
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多