【问题标题】:Backbone.js Mobile Slider - Passing Variable through View FunctionsBackbone.js 移动滑块 - 通过视图函数传递变量
【发布时间】:2013-04-04 03:17:15
【问题描述】:

我正在按照本教程构建移动滑块:http://mobile.smashingmagazine.com/2012/06/21/play-with-hardware-accelerated-css/

唯一的区别是,我正在尝试将其合并到 Backbone 中。但是,我遇到了一个变量问题。任何人都可以就如何使其发挥作用提供一些建议。在 View 的函数中传递这些变量是个问题:

var sliding = startClientX = startPixelOffset = pixelOffset = currentSlide = 0,
slideCount = $('.slide').length;

完整的主干视图:

WhiteDeals.Views.EditorView = Backbone.View.extend({

initialize: function() {
    _.bindAll(this, 'render', 'slideStart', 'slide');

    var sliding = startClientX = startPixelOffset = pixelOffset = currentSlide = 0,
    slideCount = $('#dealSlide').length;

},

events: {
    "touchstart"             : "slideStart",
    "mousedown"              : "slideStart",
    "mouseup"                : "slideEnd",
    "touchend"               : "slideEnd",
    "mousemove"              : "slide",
    "touchmove"              : "slide"
},

slideStart: function(event) {
    if (event.originalEvent.touches)
      event = event.originalEvent.touches[0];
    if (sliding == 0) {
      sliding = 1;
      startClientX = event.clientX;
    }
}, // End slideStart

slide: function(event) {
    event.preventDefault();
    if (event.originalEvent.touches)
        event = event.originalEvent.touches[0];
        var deltaSlide = event.clientX - startClientX;

    if (sliding == 1 && deltaSlide != 0) {
      sliding = 2;
      startPixelOffset = pixelOffset;
    }

    if (sliding == 2) {
      var touchPixelRatio = 1;
      if ((currentSlide == 0 && event.clientX > startClientX) ||
          (currentSlide == slideCount - 1 && event.clientX < startClientX))
        touchPixelRatio = 3;
      pixelOffset = startPixelOffset + deltaSlide / touchPixelRatio;
      $('#dealSlider').css('transform', 'translate3d(' + pixelOffset + 'px,0,0)').removeClass();
    }
},

slideEnd: function(event) {
    if (sliding == 2) {
        sliding = 0;
        currentSlide = pixelOffset < startPixelOffset ? currentSlide + 1 : currentSlide - 1;
        currentSlide = Math.min(Math.max(currentSlide, 0), slideCount - 1);
        pixelOffset = currentSlide * -$('body').width();
        $('#temp').remove();
        $('<style id="temp">#dealSlider.animate{transform:translate3d(' + pixelOffset + 'px,0,0)}</style>').appendTo('head');
        $('#dealSlider').addClass('animate').css('transform', '');
    }
}, // End slideEnd

render: function() {
    this.$el.html(JST['editor/view']());
    return this;
}

}); // End of Views EditorView

【问题讨论】:

  • 一种可能的解决方案可能是将 touchstart 事件和函数保留在 eventdelegator 中。然后在 touchstart 的函数以及所有子函数中为 touchmove 和 touchstop 添加事件监听器。
  • 仅供参考 - 对于希望在主干上添加出色的移动触摸滑块的人,我最终选择了 Swipe.js。它易于设置且性能出色。

标签: javascript jquery backbone.js mobile-website


【解决方案1】:

我会将这些变量打包到一个模型中,例如:

var CoordsModel = Backbone.Model.extend({})
var coord = new CoordsModel();

然后将其传递给WhiteDeals 视图:

var view = new WhiteDeals({model: coord});

然后通过模型的 getter/setter 访问所有函数,例如:

initialize: function() {
    _.bindAll(this, 'render', 'slideStart', 'slide');

    // var sliding = startClientX = startPixelOffset = pixelOffset = currentSlide = 0

    this.model.set('sliding', 0);
    this.model.set('startClientX', 0);
    ...
    this.model.set('currentSlide', 0);

    slideCount = $('#dealSlide').length;

},
...
slideStart: function(event) {
    if (event.originalEvent.touches)
        event = event.originalEvent.touches[0];
    if (sliding == 0) {
        // sliding = 1;
        // startClientX = event.clientX;
        this.model.set('sliding', 1);
        this.model.set('startClientX', event.clientX);
    }
}, // End slideStart

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多