在我的ember.js应用程序中,我有一个'用户'模型与'group'有“hasMany”关系。用户可以是零个或多个组的成员。为了允许用户选择组,我使用内置的Ember.Select视图。
如果我通过路由/users
加载用户,我可以看到用户以及分配给该用户的组。如果我转到编辑路径(/users/1/edit
),我会使用Ember.Select显示所有组的Universe,以及该用户的“选定”组的选择。不幸的是,当我通过/users
路线转换时,没有选择任何组。如果我在编辑路线上刷新页面,我会看到按预期正确选择了组。
需要注意的另一点是,从/users
转换为/users/1/edit
(没有选定的组)时,我看不到任何错误。但是,当我直接从/users/1/edit
路由刷新时,选择正常,但我在控制台中看到以下内容(我包含了一些堆栈):
Assertion failed: The content property of DS.PromiseArray should be set before modifying it ember.js:394
(anonymous function) ember.js:394
Ember.assert ember.js:53
Ember.ArrayProxy.Ember.Object.extend._replace ember.js:16284
Ember.ArrayProxy.Ember.Object.extend.replace ember.js:16291
Ember.EnumerableUtils.replace ember.js:1829
Ember.Select.Ember.View.extend._changeMultiple ember.js:27933
Ember.Select.Ember.View.extend._change ember.js:27859
Ember.Select.Ember.View.extend._triggerChange ember.js:27902
sendEvent ember.js:2334
任何指针都会有所帮助!
user_model.js :
Usermanagement.User = DS.Model.extend({
authenticateExternally: DS.attr(),
email: DS.attr(),
enabled: DS.attr(),
firstName: DS.attr(),
lastName: DS.attr(),
password: DS.attr(),
systemExternalAuthenticationEnabled: DS.attr(),
selectedGroups: DS.hasMany('group', {
async: true
}),
username: DS.attr(),
meta: DS.attr(),
fullName: function() {
return '%@ %@'.fmt(this.get('firstName'), this.get('lastName'));
}.property('firstName', 'lastName'),
});
user_edit_template.hbs :(摘要)
<div class="field form-group">
<div class="fieldLabel">Groups</div>
{{view Ember.Select
multiple="true"
class="form-control"
selectionBinding="selectedGroups"
contentBinding="controllers.groups.allGroups"
optionLabelPath="content.name"
optionValuePath="content.id"}}
</div>
groups_controller.js :
Usermanagement.GroupsController = Ember.ArrayController.extend({
allGroups: function() {
return this.store.find('group');
}.property()
});
编辑:忘记提及,Ember v1.0.0,Ember-data v1.0.0-beta3
答案 0 :(得分:1)
错误是抱怨在完成加载之前选择模型(user.selectedGroups)。
选择none的原因可能是因为它们可能是不同的对象。您可以迭代所选项目和allGroups选项中的每个项目,并检查其上的ember guid,如果它们是不同的项目,那么这就是它没有将它们显示为已选中的原因。
出于好奇,您可以尝试在应用程序路径的setupController中设置控制器吗?
App.ApplicationRoute = Em.Route.extend({
setupController: function(controller, model){
this._super(controller, model);
this.controllerFor('groups').set('model', this.store.find('group'));
}
});
{{view Ember.Select
multiple="true"
class="form-control"
selectionBinding="selectedGroups"
contentBinding="controllers.groups.model" //instead of allGroups
optionLabelPath="content.name"
optionValuePath="content.id"}}