JQuery / Smarty: переменная в .keyUp не определена - PullRequest
0 голосов
/ 11 марта 2011

Итак, в основном, я создаю переменные в методе keyUp поля ввода, которые получают свои данные из цикла smarty (это в пределах $(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}

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

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

1 Ответ

0 голосов
/ 11 марта 2011

Я называю то, что ты делаешь, "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 разбудить Смарти?

Edit:

Вот небольшой трюк, который мне нравится использовать, когда меня заставляют вводить 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}
...