我是Ember js / node js / mongo db中的菜鸟,并且很难实现一个简单的案例。我正在使用带有mongoose作为后端的nodejs,以及用于前端的emberjs。要求是:
用户可以属于许多组织,组织可以拥有许多用户。用户可以是管理员或客户。这就是我在后端对此进行建模的方法:
models/organization.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var OrganizationSchema = new Schema({
org_name: String,
org_address: String,
org_admins: [{ type: Schema.Types.ObjectId, ref: 'User' }],
org_customers: [{ type: Schema.Types.ObjectId, ref: 'User' }]
});
module.exports = mongoose.model('Organization',OrganizationSchema);
models/user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
username: {type: String, unique: true},
password: String,
role: String,
//organizations: [{type: Schema.Types.ObjectId, ref: 'Organization'}]
});
module.exports = mongoose.model('User',UserSchema);
然后我为用户提供CRUD。我创建了一些组织将一些用户ID存储为org_admins,有些组织为org_customers。
我想创建一个索引视图,所有组织都会出现,并有相应的管理员和相应的客户。
这就是基本模板现在在浏览器上显示的方式:
Organizations:
Org1 address1
admins:
5534a5172751c5b05b7e7cd0
5534cb359262868030211796
Customers:
org2 address2
admins:
5534a5172751c5b05b7e7cd0
customers:
5534cb359262868030211796
我希望显示客户的用户名和客户的用户名。
这是Ember边码:
app/models/organization.js
import DS from 'ember-data';
export default DS.Model.extend({
org_name: DS.attr('string'),
org_address: DS.attr('string'),
org_admins: DS.attr(),
org_customer: DS.attr()
});
app/models/user.js
import DS from 'ember-data';
var User = DS.Model.extend({
username: DS.attr('string'),
password: DS.attr('string'),
role: DS.attr('string')
});
export default User;
这是模板文件app/templates/organization.hbs
<ul>
Organizations:
<p>
{{#each organization in model}}
<li>
<label> {{organization.org_name}} </label>
<label> {{organization.org_address}}</label>
<p> <label> admins: </label></p>
<ul>
{{#each admin in organization.org_admins}}
<li>{{admin}}</li>
{{/each}}
</ul>
<p> <label> Customers: </label></p>
<ul>
{{#each customer in organization.org_customers}}
<li>{{customer}}</li>
{{/each}}
</ul>
</li>
{{/each}}
</p>
</ul>
<p>
<button {{action 'neworganization'}} > Add Organization </button>
</p>
{{outlet}}
路线档案 应用程序/路由/ organizations.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function(){
return this.store.find('organization');
}
});
我继续在控制器中获取用户名,但它没有用。 我知道我在建模关联方面做错了。我也尝试使用DS.hasMany而不是DS.attr(),但无法实现我的动机,我可能做错了什么,没有正确理解关联。
我能做到这一点的正确方法是什么。请帮忙。
答案 0 :(得分:1)
请参阅指南http://guides.emberjs.com/v1.11.0/models/defining-models/
中有关定义关联的部分当您使用DS.hasMany
时,您需要在其他模型上使用相应的DS.belongsTo
。
需要注意的另一件事是确保在组织响应有效负载中包含所有相应的用户模型,或者用{async: true}
标记关系,以便ember知道在需要时单独检索这些记录。