从 Iron Router 访问模板中的数据上下文数据时遇到问题
Trouble accessing data-context data in template from Iron Router
我有一个模板,其中的数据通过此处的 Iron Router 参数传递给它,模板的设计目的可能很明显:
lib/routes.js
// custom reset password page for child user
Router.route('/reset-password/child/:_id', {
name: 'reset-child-password',
template: 'childResetPassword',
layoutTemplate: 'appLayout',
data: function() {
return Users.findOne({ _id: this.params._id });
}
});
但是,当我尝试在模板中访问此子用户数据时,我收到错误提示 this.data
未定义。或 cannot read property 'profile' of undefined
。这是我的助手和助手的模板使用。
client/templates/childResetPassword.html
...
<h3>Reset Password for {{childFirstName}}</h3>
<form id='childResetPassword'>
<div class="form-group">
<input type="password" name="new-child-password" class="form-control" value=''>
</div>
...
client/templates/helpers/childResetPassword.js
Template.childResetPassword.helpers({
childFirstName: function() {
console.log("Template helpers:");
console.log(this.data);
return this.data.profile.firstname;
}
});
关于如何访问通过 iron 路由器数据回调传递的数据上下文有什么想法吗?我是不是用错了?
更新(仍未回复):我已验证我传递到模板数据上下文中的这个特定用户正在被发现,并且他们的个人资料中填充了 firstname
属性 ,我仍然遇到同样的错误。
根据另一个问题,我发现我试过了。我添加了一个模板呈现的回调函数,如下所示:
client/templates/helpers/childResetPassword.js
Template.childResetPassword.rendered = function() {
console.log(this);
};
我确实在浏览器控制台中看到 this.data 包含正确的用户对象,但我的 this.data.profile.firstname
仍然失败,并且再次出现相同的控制台输出错误。如果我需要在模板渲染和模板助手之间做些什么??太困惑了!!!
你不必提数据...你可以打电话 this.profile.firstname。您的应用程序已经将 'this' 理解为返回的数据对象。
Template.childResetPassword.helpers({
childFirstName: function() {
return this.profile.firstname;
}
});
所以,@Joos 的回答没有错,但是经过更多的尝试和错误,我找到了我正在从事的流星项目的解决方案。
我的项目(直到我四处查看才知道)删除了 meteor 包 autopublish
。因此,为了访问我的 collection 中的数据,我必须订阅它们。因此,我将此订阅行放在我的 Router.route
模板声明中的最佳位置:
Router.route('/reset-password/child/:_id', {
name: 'reset-child-password',
template: 'childResetPassword',
layoutTemplate: 'appLayout',
waitOn: function() { // this is new new line/option i added to my route
return Meteor.subscribe('users');
},
data: function() {
if (this.ready()) {
var childUser = Users.findOne({_id: this.params._id});
if (childUser)
return childUser;
else
console.error("Child User not found", childUser);
}
else {
this.render("Loading");
}
}
});
话虽这么说,如果您的项目中仍然有自动发布包并且您打算保留它,那么您需要做的就是@Joos answer。
但是,如果您确实打算删除它,则需要我上面的路由器解决方案,并确保您已在服务器上的某处像这样发布用户 collection:
server/publications.js
Meteor.publish("users", function () {
return Meteor.users.find();
});
我有一个模板,其中的数据通过此处的 Iron Router 参数传递给它,模板的设计目的可能很明显:
lib/routes.js
// custom reset password page for child user
Router.route('/reset-password/child/:_id', {
name: 'reset-child-password',
template: 'childResetPassword',
layoutTemplate: 'appLayout',
data: function() {
return Users.findOne({ _id: this.params._id });
}
});
但是,当我尝试在模板中访问此子用户数据时,我收到错误提示 this.data
未定义。或 cannot read property 'profile' of undefined
。这是我的助手和助手的模板使用。
client/templates/childResetPassword.html
...
<h3>Reset Password for {{childFirstName}}</h3>
<form id='childResetPassword'>
<div class="form-group">
<input type="password" name="new-child-password" class="form-control" value=''>
</div>
...
client/templates/helpers/childResetPassword.js
Template.childResetPassword.helpers({
childFirstName: function() {
console.log("Template helpers:");
console.log(this.data);
return this.data.profile.firstname;
}
});
关于如何访问通过 iron 路由器数据回调传递的数据上下文有什么想法吗?我是不是用错了?
更新(仍未回复):我已验证我传递到模板数据上下文中的这个特定用户正在被发现,并且他们的个人资料中填充了 firstname
属性 ,我仍然遇到同样的错误。
根据另一个问题,我发现我试过了。我添加了一个模板呈现的回调函数,如下所示:
client/templates/helpers/childResetPassword.js
Template.childResetPassword.rendered = function() {
console.log(this);
};
我确实在浏览器控制台中看到 this.data 包含正确的用户对象,但我的 this.data.profile.firstname
仍然失败,并且再次出现相同的控制台输出错误。如果我需要在模板渲染和模板助手之间做些什么??太困惑了!!!
你不必提数据...你可以打电话 this.profile.firstname。您的应用程序已经将 'this' 理解为返回的数据对象。
Template.childResetPassword.helpers({
childFirstName: function() {
return this.profile.firstname;
}
});
所以,@Joos 的回答没有错,但是经过更多的尝试和错误,我找到了我正在从事的流星项目的解决方案。
我的项目(直到我四处查看才知道)删除了 meteor 包 autopublish
。因此,为了访问我的 collection 中的数据,我必须订阅它们。因此,我将此订阅行放在我的 Router.route
模板声明中的最佳位置:
Router.route('/reset-password/child/:_id', {
name: 'reset-child-password',
template: 'childResetPassword',
layoutTemplate: 'appLayout',
waitOn: function() { // this is new new line/option i added to my route
return Meteor.subscribe('users');
},
data: function() {
if (this.ready()) {
var childUser = Users.findOne({_id: this.params._id});
if (childUser)
return childUser;
else
console.error("Child User not found", childUser);
}
else {
this.render("Loading");
}
}
});
话虽这么说,如果您的项目中仍然有自动发布包并且您打算保留它,那么您需要做的就是@Joos answer。
但是,如果您确实打算删除它,则需要我上面的路由器解决方案,并确保您已在服务器上的某处像这样发布用户 collection:
server/publications.js
Meteor.publish("users", function () {
return Meteor.users.find();
});