Защо обектът не е наличен в шаблона, когато iron-router връща този обект

Имам контролер за маршрут за страница, подобна на дадената по-долу, която връща обект. Но не мога да намеря този обект, когато шаблонът се визуализира, но когато отпечатам с помощта на console.log, obecjt се връща правилно към шаблона.

  MyPageController = RouteController.extend({
    template: 'myPage',
    increment: 5,
    commentsLimit: function() {
        return parseInt(this.params.commentsLimit) || this.increment;
    },
    findOptions: function() {
        return {sort: this.sort, limit: this.commentsLimit()};
    },
    subscriptions: function() {
        this.myObjectSub = Meteor.subscribe('singleObject', this.params._id);
        this.commentsSub = Meteor.subscribe('comments', this.params._id, this.findOptions());
    },
    comments: function() {
        return Comments.find({myObjectId: this.params._id}, this.findOptions());
    },
    myObj: function() {
        return MyObects.findOne(this.params._id);
    },
    data: function() {
        var hasMore = this.comments().count() === this.commentsLimit();

        return {
            myObj: this.myObj(),
            comments: this.comments(),
            ready: this.myObjectSub.ready,
            nextPath: hasMore ? this.nextPath() : null
        };
    },
    sort: {submitted: -1, _id: -1},
    nextPath: function() {
        return Router.routes.myPage.path({_id:this.params._id, commentsLimit: this.commentsLimit() + this.increment});
    }
});

Моят маршрут е дефиниран така:

Router.route('/myobjects/:_id/:commentsLimit?', {
name: 'myPage',
controller: MyPageController
});

Не мога да разбера защо MyObject не се намира от шаблона MyPage, където са налични коментарите. Когато проверявам с помощта на console.log на RouteController, MyObj се връща правилно.

РЕДАКТИРАНЕ: Мога да намеря myObj в конзолата, когато страницата е заредена, така че когато шаблонът се визуализира, myObj все още не е достъпен за шаблона.

Така че, когато върна данни в тази форма, myObj се намира и се зарежда добре.

data: function() {return MyObjects.findOne(this.params._id);}

Но когато искам да върна повече от една променлива, мога да намеря други променливи като comments & nextPath, но не и myObj?? защо е така

return {
        myObj: this.myObj(),
        comments: this.comments(),
        ready: this.myObjectSub.ready,
        nextPath: hasMore ? this.nextPath() : null
    };

person srinivas    schedule 14.12.2014    source източник


Отговори (2)


Когато шаблонът е на път да се покаже в браузъра, вие започвате вашите абонаменти. След това шаблонът ще бъде изобразен директно (преди абонаментите да са готови!) и по това време браузърът все още не е получил обекта. Ето защо MyObects.findOne(this.params._id) оценява на null във вашия шаблон, но на обекта, който очаквате, когато по-късно оценявате еквивалентното MyObects.findOne извикване в конзолата (когато абонаментите са готови).

person Peppe L-G    schedule 14.12.2014
comment
Да, мога да намеря обекта в конзолата. И така, как мога да се уверя, че шаблонът чака абонаментите да бъдат готови? Мислех, че в блока с данни Ready върши тази работа, тоест връща се само когато абонаментът за MyObj е готов. Но явно това не се случва. - person srinivas; 14.12.2014
comment
Опитах и ​​с поставянето на абонамента в waitOn, но все още не работи - person srinivas; 14.12.2014

Тъй като obj може да не е наличен при зареждане на шаблона, можете да направите следното, за да заредите всички стойности на обекта реактивно, когато данните са налични:

Template.myPage.helpers({

    _id: function() {
        return this.myObj ? this.myObj._id : '';
    },
    title: function() {
        return this.myObj ? this.myObj.title : '';
    },
});
person srinivas    schedule 15.12.2014