无法从Iron Router访问模板中的数据上下文数据

时间:2016-03-05 17:09:55

标签: javascript meteor iron-router

我有一个模板,通过Iron Router params将数据传递给它,可能很明显模板的设计目的是什么:

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;
    }
});

有关如何访问使用铁路由器数据回调传递的数据上下文的任何想法?我使用不正确吗?

更新(仍然没有回答):我已经确认我正在找到这个传递给模板数据上下文的特定用户,并且他们的个人资料中填充了firstname属性,而且我已经确认了我仍然得到同样的错误。

基于另一个问题,我发现我试过这个。我添加了一个模板渲染的回调函数,如下所示:

client/templates/helpers/childResetPassword.js

Template.childResetPassword.rendered = function() {
    console.log(this);

};

我确实在浏览器控制台中看到this.data包含正确的用户对象,但我的this.data.profile.firstname仍然失败,但同样的控制台输出错误。如果我需要在模板渲染和模板助手之间做些什么?很困惑!!!

2 个答案:

答案 0 :(得分:2)

您不必提及数据......您只需调用this.profile.firstname即可。您的应用程序已将'this'理解为返回的数据对象。

Template.childResetPassword.helpers({
    childFirstName: function() {
        return this.profile.firstname;
    }
});

答案 1 :(得分:1)

所以,@Joos的回答并没有错,但是经过更多的反复试验,我找到了我正在研究的流星项目的解决方案。

我的项目(在我查看更多内容之前不知道我)删除了流星包autopublish。因此,为了访问我的集合中的数据,我必须订阅它们。因此,我放置此订阅行的最佳位置是在此模板的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的答案就是您需要做的。

但是,如果您打算将其删除,则需要上面的路由器解决方案,并确保您已在服务器上的某个位置发布了这样的用户集合:

server/publications.js

Meteor.publish("users", function () {
    return Meteor.users.find();
});