2013-04-24 3 views
3

Я пытаюсь создать несколько экземпляров ползунка на странице. Каждый слайдер должен знать, какой слайд он просматривает в данный момент. Похоже, что когда я обновляю свойство slide, я меняю его для класса, а не экземпляра. Это говорит мне о том, что я не создаю экземпляр в своей публичной функции init(). Где я иду не так?Создание шаблона модуля JavaScript

var MySlider = (function() { 

    'use strict'; 

    var animating = 0, 
      slides = 0, // total slides 
      slider = null, 
      slide = 0, // current slide 
      left = 0; 

    function slideNext(e) { 
     if ((slide === slides - 1) || animating) return; 

     var slider = e.target.parentNode.children[0], 
       x = parseFloat(slider.style.left); 

     animate(slider, "left", "px", x, x - 960, 800); 
     slide++; 
    } 

    return { 
     init: function() { 
      var sliders = document.querySelectorAll('.my-slider'), 
         l = sliders.length; 

      for (var i = 0; i < l; i++) { 
       sliders[i] = MySlider; // I don't think this is correct. 

       slider = sliders[i]; 

       buildSlider(slider); 

      } 
     } 
    } 

})(); 
+0

У меня нет цели этого способа создания вещей, кроме добавления бесполезной сложности и источников ошибок. Может кто-нибудь просветить меня? – Virus721

+1

Ваша оценка «Я не думаю, что это правильно» хорошо оценена. вы прикрепляете один и тот же объект к каждому слайдеру. Моя склонность заключалась в том, чтобы инвертировать это и сделать MySlider конструктором, который принимает параметр (один элемент слайдера), на котором будет работать. Создайте новый MySlider для каждого элемента слайдера, который у вас есть. – underrun

+0

@underrun Не могли бы вы показать мне, как? Идея заключалась в том, что когда кто-то реализует этот модуль, они могут просто называть 'MySlider.init();' как только их DOM загрузится, а моя функция будет перебирать сопоставленные элементы на странице и создавать экземпляр для каждого. Я бы не хотел, чтобы им приходилось вручную создавать экземпляры. –

ответ

4

Основываясь на ваш комментарий, я думаю, что это больше похоже на то, что вы хотите:

MySlider = (function() { 
    Slider = function (e) { 
     this.e = e; 
     // other per element/per slider specific stuff 
    } 

    ... 

    var sliders; // define this out here so we know its local to the module not init 

    return { 
     init: function() { 

      sliders = document.querySelectorAll('.my-slider'); 
      var l = sliders.length; 

      for (var i = 0; i < l; i++) { 
       sliders[i] = new Slider(sliders[i]); //except I'd use a different array 

       slider = sliders[i]; 

       buildSlider(slider); 
     } 
    } 
})(); 

Таким образом, вы связываете каждый элемент с его собственными данными, специфичными для элемента, но у вас есть содержащий модуль, внутри которого вы можете работать с вашей коллекцией модулей.

3

кажется, что когда я обновить свойство слайда, изменить его для класса, а не экземпляра.

Вы верны. Этот код запускается только при определении класса MySlider. Если вы хотите переменную экземпляра, вам нужно объявить его внутри возвращаемого объекта, то есть часть вашего возвращения блока:

var MySlider = (function(param) { 
    return { 
     slider: param, 

     init: function() { 
      var sliders = document.querySelectorAll('.my-slider'), 
         l = sliders.length; 

      for (var i = 0; i < l; i++) { 
       sliders[i] = MySlider; // I don't think this is correct. 

       slider = sliders[i]; 

       buildSlider(slider); 

      } 
     } 
}); 
+0

Каков правильный способ создания экземпляра в этом контексте? В другом месте я видел нечто вроде 'var sliderOne = MySlider();', но, похоже, я не могу этого сделать в своей функции 'init()'. –

+0

Создайте параметр для конструктора, затем назначьте его в обратном блоке. –

+0

Обновленный код для демонстрации. –

Смежные вопросы