2015-12-09 2 views
0

Я знаю, что в этой статье есть много похожих вопросов по стеку, но для жизни я не могу понять, в чем проблема в моем коде.Проблемы с Javascript при связывании

Попытка повысить уровень в javascript, чтобы любые советы были полезны. Я создал объект для управления функциями слайдера.

var gMapSlider = { 
     mapSlideShow: false, 
     // why doesnt current place update when passed in 
     newMarker: null, 
     oldMarker: null, 
     mapSlideIn: function() { 
      this.contentSlide 
      $('#placeDetails').animate({right: '0'}); 
      this.mapSlideShow = true; 
     }, 
     mapSlideOut: function(func) { 
      if (typeof(func) != "function") func = function() {}; 
      $('#placeDetails').animate({right: '-320px'}, null, null, func()); 
      this.mapSlideShow = false; 
     }, 

     mapSlideToggle: function() { 
      (this.mapSlideShow) ? this.mapSlideOut() : this.mapSlideIn(); 
     }, 

     contentSlide: function() { 
      if (this.newMarker) $('h1', '#placeDetails').text(this.newMarker.title); 
     }, 

     mapSlide: function(marker) { 
      this.newMarker = marker; 
      if (this.oldMarker === this.newMarker) { //same marker showing 
       this.mapSlideToggle(); 
      } 
      else if (this.oldMarker !== this.newMarker && !this.mapSlideShow) { //diff marker showing 
       this.contentSlide(marker); 
       this.mapSlideIn(); 
      } 
      else if (this.oldMarker !== this.newMarker && this.mapSlideShow) { 
       var self = this; 
       console.log(self) //returns this object 
       this.mapSlideOut(function() { 
        console.log(self); // returns this object 
        self.contentSlide(this.newMarker); 
        self.mapSlideIn; 
       }).bind(self); // cannot read property 'bind' of undefined 
      } 
      this.oldMarker = this.newMarker; 
     } 
    } 

Пара вопросов

1) Проблема с моей функцией gMapSlider.mapSlide. Если я вызываю функцию mapSlide и последнее применение if, то я получаю a не могу прочитать свойство ошибки связывания. У меня есть Google'd, но не нашел никакой реальной значимости. Может ли кто-нибудь помочь с тем, что я делаю неправильно здесь.

2) Является ли это лучшим способом управления функциями в пространстве имен. Большинство образцов кода, которые я вижу, используют функции в глобальном пространстве имен, поэтому нужно немного уточнить, если рекомендуется создавать такие объекты в Javascript?

EDIT @torazaburo Спасибо, чувствую себя настоящим новичком, это была проблема. Положите это как ответ, и я стану так же решен. Любые советы по архитектуре кода?

+0

Можете ли вы создать скрипку с вашей проблемой? – AlexD

+0

Вы связываете результат вызова 'mapSlideOut', тогда как я предполагаю, что вы пытаетесь связать переданную ему функцию. Другими словами, вы потеряли правильную скобку. –

ответ

1
this.mapSlideOut(function() { 
        console.log(self); // returns this object 
        self.contentSlide(this.newMarker); 
        this.mapSlideIn; 
       }).bind(self); 

bind() должен быть вызван на объекте функции, но you'r называя его по результату вызова функции

использовать это:

this.mapSlideOut.bind(self,function() { 
        console.log(this); // returns this object 
        this.contentSlide(this.newMarker); 
        this.mapSlideIn; 
       }); 

также выше вызов возвратит вам ссылка на функцию с этой привязкой к self