2011-01-28 3 views
0

У меня есть следующий класс javascript, и по какой-то причине текущее свойство не установлено равным -1, когда я закончил загрузку записей (или я не могу правильно получить доступ к свойству из экземпляра класса). Я новичок в javascript, поэтому любая помощь будет оценена.Доступ к свойствам Javascript

var MyLib = function() { 
this.current = 0; 

MyLib.prototype.loadMore = function (id, loadingDivId, url) { 
    if (this.current > -1) { 
     this.current++; 
     $(loadingDivId).html("<h3>Loading more records please wait...</h3>"); 
     $.get(url + this.current, function (data) { 
      if (data != '') { 
       $(id).append(data); 
       $(loadingDivId).empty(); 
      } else { 
       this.current = -1; // seems like this isn't being set 
       $(loadingDivId).html("<h3><i>-- No more results -- </i></h3>"); 
      } 
     }); 
    } 
} 

};

Вот как я звоню его

<script type="text/javascript"> 
    $(function() { 
     var lib = new MyLib(); 

     $('#loadMore').click(function() { 
      if (lib.current > -1) { 
       lib.loadMore("#results", "#loading", '/home/search/'); 
       if (lib.current == -1) { 
        // Having problems getting into this portion 
        $("#loadMore").hide(); 
       } 

      } 
      return false; 
     }); 

    }); 

</script> 
+0

Я не могу проверить вещи AJAX очень легко прямо сейчас; вы проверяли, что существует аргумент 'data'? Я предполагаю, что ваш if/else терпит неудачу, и он перезагружает 'this.current' до -1. – sdleihssirhc

+0

Я не толстые данные, это проблема, так как я вижу «Больше не найдено результатов». – zSynopsis

+0

Я обновил [мой ответ] (http://stackoverflow.com/questions/4831519/javascript-property-accessing-issues/4831604#4831604). Я думаю, что сначала была функция обратного вызова в неправильном месте. – user113716

ответ

1

Хотя @Gnostus правильно о размещении прототипа, у вас есть проблема, потому что вы делая асинхронный запрос, но пытается использовать ответ сразу после отправки запроса.

Другими словами, код после ваш loadMore() вызов работает до того принимается ответ.

Смените ваш прототип, чтобы принять function для использования в обратном вызове.

// accept a function to call upon success ---------------v 
MyLib.prototype.loadMore = function (id, loadingDivId, url, fn) { 
    if (this.current > -1) { 
     this.current++; 
     $(loadingDivId).html("<h3>Loading more records please wait...</h3>"); 
     $.get(url + this.current, function (data) { 
      if (data != '') { 
       $(id).append(data); 
       $(loadingDivId).empty(); 
      } else { 
       this.current = -1; 
    // ------------v------call the function 
       fn(); 
       $(loadingDivId).html("<h3><i>-- No more results -- </i></h3>"); 
      } 
     }); 
    } 
} 

Затем передайте функциональность, которая зависит от ответа.

$('#loadMore').click(function() { 
    if (lib.current > -1) { 

      // pass in your function -----------------------------v 
     lib.loadMore("#results", "#loading", '/home/search/', function() { 
        // This if() statement could be removed, since it will 
        // always be "true" in the callback. 
        // Just do the $("#loadMore").hide(); 
       if (lib.current == -1) { 
        $("#loadMore").hide(); 
       } 
     }); 
    } 
    return false; 
}); 

Или, если это будет стандартная функциональность, вы можете добавить функцию к prototype из MyLib, и просто он принимает соответствующие аргументы. Тогда ваш loadMore можно просто назвать его от this.

+1

Спасибо за вашу помощь! – zSynopsis

+0

@zSysop: Добро пожаловать. – user113716

1

прототипы выходят вперед объявление функции

var MyLib = function() { 
this.current = 0; 
}; 

MyLib.prototype.loadMore = function (id, loadingDivId, url) { 
    if (this.current > -1) { 
     this.current++; 
     $(loadingDivId).html("<h3>Loading more records please wait...</h3>"); 
     $.get(url + this.current, function (data) { 
      if (data != '') { 
       $(id).append(data); 
       $(loadingDivId).empty(); 
      } else { 
       this.current = -1; // seems like this isn't being set 
       $(loadingDivId).html("<h3><i>-- No more results -- </i></h3>"); 
      } 
     }); 
    } 
} 
+0

Нет ничего, или никто не может предписывать методы прототипа. в функции конструктора. – KooiInc

+1

@Kooilnc, вы можете назначить элементы прототипа внутри конструктора, но это не имеет большого смысла. Если вы это сделаете, назначение будет выполняться * каждый раз, когда будет вызываться функция конструктора, что может создать еще большую путаницу, если они попытаются использовать переменные * in-scope * среды переменных конструктора в качестве примера такого типа проблемы, проверьте этот вопрос: [Установка функции прототипа javascript в объявлении класса объекта] (http://stackoverflow.com/questions/2784844/) – CMS

+0

Я предлагаю вам http://jsfiddle.net/fCVUw/1/ – KooiInc

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