2014-12-25 78 views
0

流星應用,新聞聚合器。 蒙戈DB結構:如何訪問流星中的DOM?

{_id: channelId, title: channelTitle, pubDate: channelPubdate, items: [{title: newsTitle, desc: newsDescription, link: newsLink, pubDate: Date, clicks: 0}, {}, {} ...] } 

{_id: channelId, title: channelTitle, pubDate: channelPubdate, items: [{title: newsTitle, desc: newsDescription, link: newsLink, pubDate: Date, clicks: 0}, {}, {} ...] } 

...等

模板:

<template name="newsItems"> 
{{#each itemsList}} 
    {{#each this.items}} 
     <article class="news-body-custom" onmousedown="return false" onselectstart="return false"> 
      <div class="news-content-left"> 
       <h2 class="news-header-custom">{{this.title}}</h2> 
       <time class="time-custom">{{dateTranslate this.pubDate}}</time> 
       <p class="news-content-custom">{{{this.description}}}</p> 
      </div> 

      <div class="clicks">{{this.clicks}}</div> 
     </article> 
    {{/each}} 
{{/each}} 

事件處理程序:

Template.newsItems.events({ 
    "click .news-body-custom": function(e) { 
     var iframe = document.getElementsByName("news-iframe")[0]; 
     iframe.src = this.link; 

     var target = e.target; 

     while (target.className !== "news-body-custom") { 
      target = target.parentNode; 
     } 

     var clicks = target.getElementsByClassName("clicks")[0]; 
     clicks.innerHTML = +clicks.innerHTML + 1; 
debugger; 
     News.update({ _id: Session.get("channelId"), items: { $elemMatch: { link: this.link }}}, {$inc: {clicks: 1 }}); 
    } 
}); 

我有兩個問題:

  1. 如何在此事件處理程序中訪問DOM結構(模板)?我使用本地JS解決了這個問題 - 找到目標,然後找到與目標關聯的元素。我認爲這不是優雅。是否存在流星的方式?

  2. 我需要通過增加此字段保存在Mongo中的點擊次數。我如何做到這一點?我試試這個News.update({_id:Session.get(「channelId」),items:{$ elemMatch:{link:this.link}}},{$ inc:{clicks:1}});但這不行。

謝謝你,新年快樂!

回答

1

試試這個,模板事件的功能給你帶來事件和模板對象工作,並具:

Template.newsItems.events({ 
    "click .news-body-custom": function(e, t) { 
    iframe = t.$.find('news-iframe')[0]; 
    iframe.src = this.link; 

    var target = e.target; 

    while (target.className !== "news-body-custom") { 
     target = target.parentNode; 
    } 

    var clicks = target.getElementsByClassName("clicks")[0]; 
    clicks.innerHTML = +clicks.innerHTML + 1; 
    debugger; 
    News.update({ _id: Session.get("channelId"), items: { $elemMatch: { link: this.link }}}, {$set: {"items.$": {$inc: {clicks: 1 }}}}); 
    } 
}); 

你也想確保你看看蒙戈在$位置更新:http://docs.mongodb.org/manual/reference/operator/update/positional/

1

1. 我使用的方法是

'csubmit form':function(e){ 
    e.preventDefault(); 
    $(e.target).find('[name=test]');//something like that 
} 
  • 點擊次數不會追加,因爲你發現整個迴歸新聞,不只是與點擊陣列,IMO你應該再拍集合持有類似的項目:
  • {_id: channelId, title: channelTitle, pubDate: channelPubdate, items:[id1, id2, id3]}

    {{#each news}} 
        {{#each Item}} 
    
        {{/each}} 
    {{/each}} 
    

    和輔助(使其快速,prolly有更好的方式來做到這一點),通過每個項目進行遍歷時,

    Item: function(){ 
        var array=[]; 
        for(var i=0;i<this.items.length;i++) 
        array.append(Items.find({_id:this.items[0]})) 
        return array; 
    } 
    

    然後做這樣的事情:

    'click button': function(){ 
         Items.update({_id:this._id},{$inc:{clicks:1}}); 
    } 
    
    +0

    雖然我同意重構到另一個集合是有道理的,但我的答案實際上涵蓋了如何去做問題。事件函數爲您提供了查找事物的模板對象,您可以使用位置運算符來更新Mongo中元素的右側部分。 –