用于返回isAuthor函数的Meteor辅助函数

时间:2015-01-10 11:43:02

标签: meteor meteor-helper

我试图实现与TelescopeJS类似的东西,但要容易得多。所以我只是想知道是否有办法检查作者的身份。

我想要做的是,只显示文章作者的删除按钮。我的文章在集合中包含以下字段:

 Articles.insert({description:description,name:name,hashtag:hashtag,src:url,author:Meteor.userId()});

我希望删除按钮仅显示给帖子的作者。所以我需要一个辅助函数来返回一个布尔值。 该函数应遵循:如果当前用户标识等于作者的用户标识,则返回true,否则返回false。现在它是一个相当简单的功能,但我不知道如何调用我的集合中的作者字段。

提前致谢!

JS CODE:

Template.pinterest.helpers({
    articles: function() {
        var search = {};
        return Articles.find(search, {
            limit: 20
        });
    },
    adding_interest: function() {
        return Session.get('adding_interest');
    },
    numlikes: function() {
        return Likes.find({
            article: this._id
        }).count();
    },
    likethis: function() {
        var curUserlike = Likes.findOne({
            muser: Meteor.userId(),
            article: this._id
        });
        if (curUserlike) {
            return "You Like This";
        } else {
            return "Thumbs up!";
        }
    },
    updated: function() {
        return Session.get('updated');
    },
    isAuthor: function() {
        if (this.author === Meteor.userId()) { //this.author is author in doc
            console.log(this.author);

        }

    }

});

Template.article.helpers({
    numlikes: function() {
        return Likes.find({
            article: this._id
        }).count();
    },


    userName: function() {
        return Meteor.user().username || Meteor.user().profile.name || Meteor.userId()
    },
    userimage: function() {
        if (Meteor.user().services.facebook) {
            return "http://graph.facebook.com/" + Meteor.user().services.facebook.id + "/picture/?type=large";
        }
    },

    timestamp: function() {
        return new Date();
    },
    likethis: function() {
        var curlike = Likes.findOne({
            muser: Meteor.userId(),
            article: this._id
        });
        if (curlike) {
            return "You Like This";
        }
    }
});


Template.pinterest.rendered = function() {
    setTimeout(function() {
        masonize(function() {});

    }, 1000)
    $('.search-query input').focus();

}

HTML模板

    <template name="article">   
 <div class="item">
    <div class="ui special cards">
  <div class="card">
    <div class="dimmable image">
      <div class="ui dimmer">
        <div class="content">
          <div class="center">
    {{#if currentUser}}
            <div class="ui inverted button">

                <a href="#" class="like">
                <i class="heart icon"></i> Like
            </a>   
            </div>
                 {{/if}}    
          </div>
        </div>
      </div>

  <img src="{{src}}"/>

  <script>$('.special.cards .image').dimmer({
  on: 'hover'
});</script>

    </div>
    <div class="content">
      <a class="header">{{name}}</a>
      <div class="meta">
        <span class="date">{{timestamp}}</span><br><a href="#">{{hashtag}}</a>
      </div>
    </div>
    <div class="extra content">
      <a>

      {{#if currentUser}}     
        <p>
            <a href="#" class="like">
            <i style="color:#564f8a;" class="heart icon"></i>
            </a>

            <a class="ui purple circular label">
              {{numlikes}} likes
               </a>&nbsp;&nbsp;
              <div class="ui red horizontal label">{{likethis}}</div><br>
            **{{#if isAuthor}}
              <a class="remove"><i style="color:#d95c5c;" class="remove icon">{{removeArticle}}</i></a>

            {{/if}}**

        </p><br>
        {{/if}} 
      </a>
      <div class="description">
      <p>{{description}}</p>

    </div>
     {{#if currentUser}}
     <hr>    
    <div class="extra content">
    <div class="right floated author">
      <img class="ui avatar image" src="{{userimage}}"> {{author}}
    </div>
  </div>
  {{/if}}   
    </div>
  </div>
</div>

</div>

</template>

3 个答案:

答案 0 :(得分:0)

{{#if isAuthor}}
              <a class="remove"><i style="color:#d95c5c;" class="remove icon">{{removeArticle}}</i></a>
{{/if}}

isAuthor:function(){
  if(this.author === Meteor.userId()){ //this.author is author in doc
    return true;
  }
  else{
    return false;
  }

修改

如果你没有将任何数据上下文传递给模板,那么在帮助器中

isAuthor:function(){
      //here some how you need the id of the document
      //I saw in your numlikes helper this._id returning the current doc id use the same inplace of id in the following query selector
     //before continue confirm whether you are getting _id or not by log to console
      var article= Article.findOne({_id:this._id});
      if(article && article.author === Meteor.userId()){ //this.author is author in doc
        return true;
      }
      else{
        return false;
      }

答案 1 :(得分:0)

在Meteor助手中,您将无法访问带有this参考的模板对象

因此,您需要修改代码,如下所示

  • author传递给模板中的辅助函数,如下所示 -

        {{#if isAuthor author}}
          <a class="remove"><i style="color:#d95c5c;" class="remove icon">{{removeArticle}}</i></a>
    
        {{/if}}
    

观察作者从模板

传递给isAuthor的方式
  • 现在,从javascript
  • 更改帮助函数
isAuthor: function(author){
 if (this.author === author)
   return true 
 else 
   return false
}

答案 2 :(得分:0)

使用transform将isAuthor字段添加到每篇文章中。像这样。

// the articles helper
articles: function(){
  var userId = Meteor.userId();
  return Articles.find({},{transform: function (doc ){
    doc.isAuthor = doc.author === userId; 
    return doc;
  }});
}