通过单击非模板元素来获取骨干排序集合

时间:2016-02-26 07:41:33

标签: javascript jquery backbone.js underscore.js

我想通过点击非骨干模板元素

来对骨干集合进行排序

简而言之,我有两个名为“按日期排序”和“按名称排序”的排序选项。当我点击这些元素时,我需要在骨干视图中对我的集合进行排序

查看模板:

    <ul>
    <li>Sort By date</li>
    <li>Sort By name</li>
    </ul>

    <script type="foo/bar" id='videos-thumbnail'>
          <div class="col-md-4">
          <div class="video-thumbnail-item">
            <div style="background-image:url(recenty_added/recentlyadded2.jpg);" class="video-thumbnail"> </div>
            <div class="video-details">
              <div class="video-title text-purple uppercase"><%= title %></div>
              <div class="video-date"><%= date %></div>
            </div>
            <div class="video-thumbnail-checkbox"> <span class="custom-checkbox">
              <input type="checkbox" class="playlist-checkbox" name="addto-playlist[]">
              </span>
              <% if (is_rights_managed== true) { %>
              <div class="checkbox-label-light">RM</div>
              <% } else {%>
              <div class="checkbox-label-light"></div>
              <% } %>
            </div>
            <div class="video-thumbnail-options"> <span title="Download" class="option-parts"> <i class="fa fa-download"></i> </span> <span title="Edit" class="option-parts"> <i class="fa fa-pencil"></i> </span> <span title="More Information" class="option-parts"> <i class="fa fa-info-circle"></i> </span> <span title="View Details" class="option-parts"> <i class="fa fa-search"></i> </span> <span title="Add to Clipbins" class="option-parts"> <i class="fa fa-folder-open"></i> </span> <span title="Add to Cart" class="option-parts"> <i class="fa fa-cart-plus"></i> </span> <span title="Contact me about this Clip" class="option-parts"> <i class="fa fa-envelope"></i> </span> </div>
          </div>
        </div>
    </script> 

<div class="row" id="thumbnail_target"> </div>

App:

//backbone & underscore
$(function() {
var Videos = Backbone.Model.extend();

var VideoList = Backbone.Collection.extend({
   model: Videos,
   url: 'https://api.myjson.com/bins/4mht3'
});

var videos = new VideoList();

var VideoView = Backbone.View.extend({
   el: "#thumbnail_target",
   template: _.template($('#videos-thumbnail').html()),
   render: function(eventName) {
      _.each(this.model.models, function(video){
         var videoTemplate = this.template(video.toJSON());
         $(this.el).append(videoTemplate);
      }, this);
      return this;
   },
});

var videosView = new VideoView({model: videos});

videos.fetch({
    success: function() {
        videosView.render();
        videoslistView.render();
    }
});

});

是骨干和下划线的新手,我不知道如何使这项工作

示例小提琴:Fiddle

2 个答案:

答案 0 :(得分:2)

由于您可以访问集合外部视图,因此您可以简单地使用jquery绑定<li>的事件处理程序,该处理程序更新集合comparator并对其进行排序。然后在集合上发生排序事件时让视图重新呈现。

对于演示我正在使用字符串和数字类型的排序属性,以便我可以直接将其设置为比较器。您应该编写一个自定义比较器函数,根据不同类型的参数(如字符串,数字,日期等)处理排序。Updated fiddle

//backbone & underscore
$(function() {
  var Videos = Backbone.Model.extend();
  var VideoList = Backbone.Collection.extend({
    model: Videos,
    url: 'https://api.myjson.com/bins/4mht3'
  });
  var videos = new VideoList();
  var VideoListView = Backbone.View.extend({
    el: "#thumbnail_target",
    template: _.template($('#videos-thumbnail').html()),
    initialize: function() {
      this.listenTo(this.collection, 'sort', this.render);
    },
    render: function(eventName) {
      this.$el.empty();
      _.each(this.collection.models, function(video) {
        var videoTemplate = this.template(video.toJSON());
        this.$el.append(videoTemplate);
      }, this);
      return this;
    },
  });
  var videosView = new VideoListView({
    collection: videos
  });
  videos.fetch({
    success: function(collection) {
      videosView.render();
    }
  });
  $('#sortBy').on('click', 'li', function() {
    var category = $(this).text().split('Sort By ')[1];
    videos.comparator = category;
    videos.sort();
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>
<ul id="sortBy">
  <li>Sort By average</li>
  <li>Sort By title</li>
</ul>
<script type="foo/bar" id='videos-thumbnail'>
  <div class="col-md-4">
    <div class="video-thumbnail-item">
      <div style="background-image:url(recenty_added/recentlyadded2.jpg);" class="video-thumbnail"></div>
      <div class="video-details">
        <div class="video-title text-purple uppercase">
          <%=t itle %>
        </div>
        <div class="video-date">
          <%=d ate %>
        </div>
      </div>
      <div class="video-thumbnail-checkbox"> <span class="custom-checkbox">
          <input type="checkbox" class="playlist-checkbox" name="addto-playlist[]">
          </span>
        <% if (is_rights_managed==t rue) { %>
          <div class="checkbox-label-light">RM</div>
          <% } else {%>
            <div class="checkbox-label-light"></div>
            <% } %>
      </div>
      <div class="video-thumbnail-options"> <span title="Download" class="option-parts"> <i class="fa fa-download"></i> </span>  <span title="Edit" class="option-parts"> <i class="fa fa-pencil"></i> </span>  <span title="More Information" class="option-parts"> <i class="fa fa-info-circle"></i> </span> 
        <span
        title="View Details" class="option-parts"> <i class="fa fa-search"></i> 
          </span> <span title="Add to Clipbins" class="option-parts"> <i class="fa fa-folder-open"></i> </span>  <span title="Add to Cart" class="option-parts"> <i class="fa fa-cart-plus"></i> </span>  <span title="Contact me about this Clip" class="option-parts"> <i class="fa fa-envelope"></i> </span> 
      </div>
    </div>
  </div>
</script>

<div class="row" id="thumbnail_target"></div>

答案 1 :(得分:1)

您希望全球发布应用内活动

$(function() {
  var channel;

  channel = _.extend({}, Backbone.Events);

  $('.some-sort-dy-date-element').on('click', function() {
    channel.trigger('app:sort', {sortBy: 'date'});
  });

  $('.some-sort-dy-name-element').on('click', function() {
    channel.trigger('app:sort', {sortBy: 'name'});
  });

  // rest logic
});

您的VideoList收藏集应该收听此类channel事件(initialize的示例):

var VideoList = Backbone.Collection.extend({
  initialize: function initialize() {
    this.listenTo(channel, 'app:sort', function someSortLogic() {
      this.trigger('your.app.ns.videos.SORTED');
    });
  }
});

var VideoView = Backbone.View.extend({
  initialize: function initialize() {
    this.listenTo(this.collection, 'your.app.ns.videos.SORTED', this.render);
  }
});