JQuery/Smarty: переменная в .keyUp не определена

Итак, в основном, я создаю переменные в методе keyUp поля ввода, которые получают свои данные из умного цикла (это внутри $(document.ready)

Вот код

{section name=unitEl loop=$allNavies}
    $("#attack-navy{$allNavies[unitEl].ID}-number").keyup(function(){
        var unit = {$allNavies[unitEl]};
        var element = $("#attack-navy" + unit.ID + "-number");
        var available_count = {$NAVY_{$allNavies[unitEl].ID}_AVAILABLE_COUNT|default:'0'};
        alert(unit.ID);
        // Unit max = available count
        if(element.val() > available_count)
        {
            completeUnitValue(element, available_count);
        }
        // If transport navy: Increase capacity
        if({$allNavies[unitEl].ID} == 16 || {$allNavies[unitEl].ID} == 19 || {$allNavies[unitEl].ID} == 20)
        {
            $("#attack-max-capacity").text(getMaxCapacity());
        }
    });
{/section}

Проблема в том, что когда я предупреждаю любую переменную (единицу, элемент, available_count), я получаю undefined, но когда я использую smarty {$allNavies[unitEl]} вместо переменных, все работает нормально. Я просто создал переменные, чтобы сделать код более читабельным.

Кто-нибудь знает, почему?


person Ave    schedule 11.03.2011    source источник


Ответы (1)


Я называю то, что вы делаете, "smarvascript". Я ненавижу это и умоляю своих коллег избегать этого. Но с другой стороны, я вообще ненавижу Смарти, так что держи.

Эта строка:

var unit = {$allNavies[unitEl]};

присваивает некоторое значение PHP переменной JS.

Эта строка:

alert(unit.ID);

делает вид, будто вы считаете, что «юнит» — это объект со свойствами. Вы не можете напрямую назначить объект PHP объекту JS и ожидать, что он будет работать...

Мне нужно увидеть часть вашего PHP-кода и структуры данных, чтобы объяснить, как вы должны это делать, но возможно, что это может помочь

var unit = {$allNavies[unitEl]|json_encode};

Или, если $allNavies[unitEl] является массивом:

var unit = {$allNavies[unitEl]|@json_encode};

Я, вероятно, мог бы больше всего помочь, если бы знал, какова структура $allNavies.

Кроме того, мне любопытно... где ваши {буквальные} маркировки, чтобы фигурные скобки JS не приводили Smarty в бешенство?

Изменить:

Вот небольшой трюк, который я люблю использовать, когда меня заставляют внедрить Smarty в JS:

//{literal}
( function( allNavies )
{
    /*
      allNavies is now a JS object and you can work purely with JS in here
     */
}(
    //{/literal}
    {$allNavies|@json_encode}
    //{literal}
) );
//{/literal}
person JAAulde    schedule 11.03.2011
comment
Я попытался установить {$allNavies[unitEl].ID} в переменную модуля вместо объекта - все еще не определено - person Ave; 11.03.2011
comment
Единственный способ установить 'unit.id' - это если вы установите 'unit' на пустой объект ({}), а затем назначите $allNavies[unitEl].ID в 'unit.id'. Или если вы используете некоторую кодировку JSON, как я уже упоминал. Можете ли вы сказать мне, что это за структура $allNavies? - person JAAulde; 11.03.2011
comment
это просто ассоциативный массив, если я использую $allNavies с smarty + javascript в качестве параметра метода, он работает хорошо, если только я не пытаюсь сохранить его в переменной. Я умоляю думать, что это как-то связано с document.ready. Я новичок в jquery/ajax, поэтому понятия не имею :(. - person Ave; 11.03.2011
comment
У меня мало информации о буквальных маркировках и тому подобном (я даже не знаю, что это такое), я новичок здесь, просто исправляю ошибки. Может быть, это работает, потому что это не файл javascript, а файл tpl. - person Ave; 11.03.2011
comment
К сожалению, у меня есть несколько лет опыта ежедневного использования Smarty. Но мы на довольно старой версии, я полагаю. Возможно, они что-то изменили в отношении литералов. В любом случае, это не должно иметь ничего общего с doc-ready, поскольку умный материал — это PHP, который выполняется на сервере. Вам было бы полезно просмотреть исходный код, чтобы увидеть, что на самом деле выводит PHP. Тем временем я добавлю редактирование в свой пост на основе массива assoc, который вы упомянули. - person JAAulde; 11.03.2011
comment
Хорошо, наконец-то я закончил то, что делал, поэтому я попробовал @json_encode, и он без проблем распечатал unit.ID. Огромное спасибо! Это сработало - var unit = {$allNavies[unitEl]|@json_encode}; оповещение (устройство.ID); - person Ave; 11.03.2011
comment
А, хорошо, рад, что у тебя все работает. См. материал, который я добавил в разделе «Редактировать» в моем ответе, для подсказки. :) - person JAAulde; 11.03.2011