我正在构建一个Meteor应用程序,并希望用户能够更新/设置他们的名字。我已经设置了代码,一切似乎都在工作,除了它在更新时神秘失败。这是我的代码:
模板
<template name="_editName">
{{#ionModal focusFirstInput=true customTemplate=true}}
<form id="updateName">
<div class="bar bar-header bar-stable">
<button data-dismiss="modal" type="button" class="button button-clear button-assertive">Cancel</button>
<h2 class="title">Update your name</h2>
<button type="submit" class="button button-positive button-clear">Save</button>
</div>
<div class="content has-header overflow-scroll list">
<label class="item item-input">
<input type="text" id="firstName" placeholder="Given Name">
</label>
<label class="item item-input">
<input type="text" id="lastName" placeholder="Surname">
</label>
</div>
</form>
{{/ionModal}}
</template>
客户端代码
Template._editName.events({
'submit #updateName': function(event, template) {
event.preventDefault();
console.log('Submitted');
var firstName = document.getElementById('firstName').value;
var lastName = document.getElementById('lastName').value;
Meteor.call('editName', firstName, lastName, function(error) {
if (error) {
throw new Error(error.reason);
} else {
Router.go('profile');
}
});
IonModal.close();
IonKeyboard.close();
}
});
服务器端代码
Meteor.methods({
'editName': function(firstName, lastName) {
console.log(firstName); // returns expected value
console.log(lastName); // returns expected value
Meteor.users.update({_id: this.userId}, {$set: {
'profile.firstName': firstName,
'profile.lastName': lastName
}});
Meteor.users.findOne({_id: this.userId}, {fields: {
'profile.firstName': 1, _id: 0}}); // returns undefined
}
});
一切正常:在提交时,函数获取字段值,在服务器上调用方法,成功传递字段值。更新似乎工作,因为没有抛出任何错误。但是,&#39; profile.firstName&#39;返回undefined并且不会显示在我的模板中。
我使用的是基于帐户的包和aldeed:collection2。我有以下架构设置:
Schema.UserProfile = new SimpleSchema({
firstName: {
type: String,
regEx: /^[a-zA-Z-]{2,25}$/,
optional: true
},
lastName: {
type: String,
regEx: /^[a-zA-Z]{2,25}$/,
optional: true
}
});
我完全不知道出了什么问题,并希望得到一切帮助!
答案 0 :(得分:1)
我已经检查了您的代码,但我发现需要您注意的多个问题。
请从 here 获取修复后的项目,然后按照说明进行操作。
主要问题是:
Accounts.onCreateUser(function(options, user) {
// We're enforcing at least a profile skeleton object to avoid needing to check
// for its existence later.
// this file should reside on Server (e.g. [root]/server/accounts.js)
profile = {
firstName: '',
lastName: '',
birthday: '',
sex: '',
grade: '',
country: '',
hostel: '',
house:''
}
user.profile = profile;
return user;
});
Meteor.publish('userProfile', function() {
if(!this.userId) {
return null
} else {
return Meteor.users.find({_id: this.userId}, {
fields: {
username: 1,
'profile.firstName': 1,
'profile.birthday': 1,
'profile.sex': 1,
'profile.grade': 1,
'profile.country': 1,
'profile.hostel': 1,
'profile.house': 1
}
});
}
作为一般规则(至少根据我的经验),我总是从最低限度开始,避免使用复杂的软件包而没有坚实的框架基础。这将在未来为您节省大量的调试和挫折:)。
请在验证后立即接受此答案,以便我可以从我的github帐户再次将其删除。
祝你好运。答案 1 :(得分:0)
请参阅下面的工作示例代码供您参考:
用户详细信息模板标记
{{#with currUser}}
<form class="edit-todo" id="edit-user">
Username:
<input type="text" name="username" value="{{profile.name}}" />
Firstname:
<input type="text" name="firstname" value="{{profile.firstname}}" />
Lastname:
<input type="text" name="lastname" value="{{profile.lastname}}" />
<button type="submit" style="width: 100px;height:50px">Save user</button>
</form>
{{/with}}
用户详细信息模板代码
Template.UsersDetail.events({
'submit form#edit-user': function(e, tmpl) {
e.preventDefault();
var firstname = tmpl.find('input[name=firstname]').value;
var lastname = tmpl.find('input[name=lastname]').value;
var userId = Meteor.userId();
Meteor.call('editName', userId, firstname, lastname, function(error) {
if (error) {
throw new Error(error.reason);
} else {
Router.go('users.detail', {
_id: userId
});
}
});
}
});
Template.UsersDetail.helpers({
currUser: function() {
return Meteor.users.findOne({
_id: Meteor.userId()
});
}
});
名称更新的服务器方法
/*****************************************************************************/
/* Server Only Methods */
Meteor.methods({
'editName': function(userId, firstName, lastName) {
Meteor.users.update({_id: userId}, {$set: {
'profile.firstname': firstName,
'profile.lastname': lastName
}});
console.log(Meteor.users.findOne({_id: this.userId}).profile.lastname);// returns the proper name
}
});