Jquery .each () Проблема с областью (ошибка?) - PullRequest
3 голосов
/ 30 августа 2011

По какой-то причине мой вызов вложенных функций jQuery.each () теряет область видимости для некоторых переменных, но не для других.В приведенном ниже коде ссылка Client.KNE работает, но ClientDiv нет, хотя до этого каждая из них определяется как заполненные переменные ...

Переключая Client и ClientDiv на глобальные переменные, он работает, но я чувствую, что мне не нужно создавать глобальные переменные здесь ...

Не работает:

jQuery.each(Messages.Additions, function (clientIndex) {
    var Client = Messages.Additions[clientIndex];
    var ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex) {
            var KNE = Client.KNE[kneIndex];                       // Works
            var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);  // DOES NOT WORK

Работает:

jQuery.each(Messages.Additions, function (clientIndex) {
    Client = Messages.Additions[clientIndex];
    ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex) {
            KNE = Client.KNE[kneIndex];                       // Works
            KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);  // Works

Любойзнаете, что я делаю не так в первой версии?Или это ошибка?Почему одна переменная работает, а другая нет ...

Отсюда: Jquery $ (). Каждый метод скрывает ключевое слово this похоже, что я мог передать переменныев вызов функции, но должен ли я?

Пробовал вышеуказанную ссылку, и она не работает:

jQuery.each(Messages.Additions, function (clientIndex) {
    var Client = Messages.Additions[clientIndex];
    var ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex, Client, ClientDiv) {
            var KNE = Client.KNE[kneIndex];
            var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);   //Does not work - ClientDiv undefined

Подобные вопросы без удовлетворительного ответа: Объем jQuery каждый() функция?

РЕШЕНИЕ

$.each(Messages.Additions, function () {
    var $Client = this;
    var $ClientDiv = $("#clientTitle_" + $Client.ClientID);

    if (!$ClientDiv.length) {
        $("#ClientTemplate").tmpl($Client).appendTo("#ClientContainer");
    } else {
        $.each($Client.KNE, function () {
            var $KNE = this;
            var $KNEDiv = $ClientDiv.find("#kneTitle_" + jq($KNE.KNE));    
            // SWITCHED TO $ PREFIX

1 Ответ

3 голосов
/ 30 августа 2011

Вы можете попробовать это, используя ключевое слово this, которое указывает на текущий элемент в цикле.Вместо проверки на if (ClientDiv == null) вы должны проверить на if (ClientDiv.length > 0), потому что jQuery возвращает пустой объект, если он не находит элемент, поэтому проверка не удастся.

...