簡體   English   中英

Template.onRendered()調用為時過早

[英]Template.onRendered() called too early

我遇到了一個奇怪的問題。 我正在使用Hammer.js來配置長按事件,並將事件觀察程序附加到Template.onRendered()回調中。 這在我的本地開發機器上完美運行。 但是,當我部署到服務器時,似乎在模板在瀏覽器中完成渲染之前已觸發onRendered()。 jQuery選擇器為空。 在配置事件處理程序之前,我不得不求助於設置計時器以確保模板已呈現。 另外,我嘗試在Tracker.afterFlush()中代替setTimeout()配置事件處理程序,但是在觸發時仍無法呈現模板。

看來我不必在這里使用setTimeout()。 我是在做錯事還是亂序?

Template.CATEGORIES.onRendered(function () {

Meteor.setTimeout(function () {
    console.log('setting up hammer object', this.$('.collapsible'));
    var h = this.$('.collapsible').hammer({domEvents:true});
    h.on('tap press swipe pan', '.collapsible-header', function (ev) {
        // get the ID of the shopping list item object
        var target = ev.target;
        var $target = $(target);
        var type = ev.type;
        var $header = $target;
        if (Collapse.isChildrenOfPanelHeader($target)) {
            $header = Collapse.getPanelHeader($target);
        }

        console.log('Firing ', type, ' on ', $header);
        Kadira.trackError('debug', 'Firing ' + type + ' on ' + $header);

        // handler for checkbox
        if (type === 'tap' && $target.is('label')) {

            var data = Blaze.getData(target);
            var TS = data.checkedTS;
            ev.preventDefault();
            data.checked = !data.checked;

            console.log('Checkbox handler', data);

            if (data.checked && !TS) {
                TS = new Date()
            } else if (!data.checked) {
                TS = null
            }

            // Set the checked property to the opposite of its current value
            ShoppingList.update(data._id, {
                $set: {checked: data.checked, checkedTS: TS}
            });

        } else if (type === 'tap' && $target.has('.badge')) {
            // if the user taps anywhere else on an item that has a child with .badge class
            // this item has deals.  Toggle the expand.

            console.log('badge handler');

            $header.toggleClass('active');
            Collapse.toggleOpen($header);

        } else if (type === 'press' || type === 'swipe' || type === 'pan') {
            // remove any selected deals
            var itemID, item;
            var $label = $header.find('label');

            console.log('long press handler');

            if ($label) {
                itemID = $label.attr('for');
                item = ShoppingList.findOne(itemID);
                if (item && item.deal) {
                    Deals.update(item.deal._id, {$set: {'showOnItem': false}});
                    ShoppingList.update(itemID, {$set: {'deal': null}});
                }
            }
        }

    })

}, 2000);

});

前幾天有人回答了這個問題,但肯定已經撤回了答案。 他們建議實際渲染模板,但數據訂閱尚未完成復制。 他們是對的。

我能夠驗證是否需要等待數據訂閱完成之后再設置Java腳本事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM