2015-10-06 82 views
0

我遇到了一個奇怪的問題。我正在使用hammer.js配置長按事件,並在Template.onRendered()回調中附加事件觀察器。這適用於我的本地開發機器。但是,當我部署到服務器時,似乎在模板在瀏覽器中完成呈現之前,onRendered()被觸發。 jQuery選擇器是空的。我不得不求助於設置一個計時器來確保在配置事件處理程序之前渲染模板。或者,我嘗試在Tracker.afterFlush()中代替setTimeout()來配置事件處理程序,但是當這種情況發生時,模板仍然不會呈現。Template.onRendered()調用太早

看來,我不應該在這裏使用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); 

}); 

回答

0

有人回答了這一天,但必須撤回他們的答案。他們建議模板實際呈現,但數據訂閱尚未完成複製。他們是對的。

我能夠驗證我需要等到數據訂閱完成之後才能設置我的Java腳本事件。