我不知道我的应用中出了什么问题。我正在尝试更新用户个人资料。如果用户已有配置文件,则应显示配置文件的当前值。我有一个附加到用户集合的SimpleSchema。
<template name="updateCustomerProfile">
<div class="container">
<h1>Edit User</h1>
{{#if isReady 'updateCustomerProfile'}}
{{#autoForm collection="Users" doc=getUsers id="profileForm" type="update"}}
<fieldset>
{{> afQuickField name='username'}}
{{> afObjectField name='profile'}}
</fieldset>
<button type="submit" class="btn btn-primary">Update User</button>
<a class="btn btn-link" role="button" href="{{pathFor 'adminDocuments'}}">Back</a>
{{/autoForm}}
{{else}}
Nothing
{{/if}}
</div>
</template>
我有一个模板助手:
Template.updateCustomerProfile.events({
getUsers: function () {
//return Users.findOne();
return Meteor.user();
}
});
我有一个Autoform挂钩
AutoForm.addHooks(['profileForm'], {
before: {
insert: function(error, result) {
if (error) {
console.log("Insert Error:", error);
AutoForm.debug();
} else {
console.log("Insert Result:", result);
AutoForm.debug();
}
},
update: function(error) {
if (error) {
console.log("Update Error:", error);
AutoForm.debug();
} else {
console.log("Updated!");
console.log('AutoForm.debug()');
}
}
}
});
有以下路线:
customerRoutes.route('/profile/edit', {
name: "updateCustomerProfile",
subscriptions: function (params, queryParams) {
this.register('updateCustomerProfile', Meteor.subscribe('usersAllforCustomer', Meteor.userId()));
},
action: function(params, queryParams) {
BlazeLayout.render('layout_frontend', {
top: 'menu',
main: 'updateCustomerProfile',
footer: 'footer'
});
}
});
最后是以下出版物:
Meteor.publish('usersAllforCustomer', function (userId) {
check(userId, String);
var user = Users.findOne({_id: userId});
if (Roles.userIsInRole(this.userId, 'customer')) {
return Users.find({_id: userId});
}
});
这是集合:
Users = Meteor.users;
Schema = {};
Schema.UserProfile = new SimpleSchema({
firstName: {
type: String,
optional: true
},
lastName: {
type: String,
optional: true
},
gender: {
type: String,
allowedValues: ['Male', 'Female'],
optional: true
},
organization : {
type: String,
optional: true
}
});
Schema.User = new SimpleSchema({
username: {
type: String,
optional: true
},
emails: {
type: Array,
optional: true
},
"emails.$": {
type: Object
},
"emails.$.address": {
type: String,
regEx: SimpleSchema.RegEx.Email
},
"emails.$.verified": {
type: Boolean
},
createdAt: {
type: Date,
optional: true,
denyUpdate: true,
autoValue: function() {
if (this.isInsert) {
return new Date();
}
}
},
profile: {
type: Schema.UserProfile,
optional: true
},
services: {
type: Object,
optional: true,
blackbox: true
},
roles: {
type: [String],
optional: true
}
});
Meteor.users.attachSchema(Schema.User);
我确定在发布中传递了用户对象。我无法更新配置文件:收到以下错误(来自Autoform调试):
Update Error: Object {$set: Object}
$set: Object
profile.firstName: "test_firstname"
profile.gender: "Female"
profile.lastName: "test_lastname"
profile.organization: "test_organisation
"username: "test_username"
如何更新个人资料,瞎眼......
答案 0 :(得分:3)
您需要更改before AutoForm Hooks。
AutoForm.addHooks(['profileForm'], {
before: {
insert: function(doc) {
console.log('doc: ', doc);
return doc;
},
update: function(doc) {
console.log('doc: ', doc);
return doc;
},
},
});
虽然after
回调具有js标准(error, result)
函数签名,但before
回调只有一个参数,即要插入/更新的文档。这就是您始终记录“错误”的原因,它只是您要插入的文档。您还需要返回它,或将其传递给this.result以实际插入/更新数据库中的对象。
var hooksObject = {
before: {
// Replace `formType` with the form `type` attribute to which this hook applies
formType: function(doc) {
// Potentially alter the doc
doc.foo = 'bar';
// Then return it or pass it to this.result()
return doc; (synchronous)
//return false; (synchronous, cancel)
//this.result(doc); (asynchronous)
//this.result(false); (asynchronous, cancel)
}
},
答案 1 :(得分:2)
有几个小问题,所以我不确定如何解决您的问题,但这里有一些事情需要解决。
发布方法
C:\Anaconda\lib\site-packages\scipy\sparse\compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
SparseEfficiencyWarning)
。你想尝试使用吗?
它? user
作为函数参数包含在内
访问userId
this.userId
以便它会覆盖默认的当前用户出版物 注意:如果您删除发布Meteor.publish(null, ...)
功能,请不要忘记将其从路由usersAllforCustomer
使用全球助手updateCustomerProfile
以下是如何更新模板以使用currentUser
代替currentUser
getUsers
希望这有帮助。
答案 2 :(得分:0)
meteorpad确实解决了这个问题。帮助者有一个错误。事实上,原始代码是:
Template.updateCustomerProfile.events({
getUsers: function () {
return Meteor.user();
}
});
所以在上面的代码片段中我使用的是'events'而不是'helper'。以下是正确的代码:
Template.updateCustomerProfile.helpers({
getUsers: function(){
return Meteor.user();
}
});