0

所以基本上,我在输入框的 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}

问题是,当我提醒任何变量(单位、元素、available_count)时,我收到未定义的信息,但是当我使用 smarty{$allNavies[unitEl]}而不是变量时,一切正常。我刚刚创建了变量以使代码更具可读性。

有谁知道为什么?

4

1 回答 1

0

我把你正在做的事情称为“smarvascript”。我讨厌它,并恳求我的同事避免它。但是,我完全讨厌Smarty,所​​以你去吧。

这一行:

var unit = {$allNavies[unitEl]};

将一些 PHP 值分配给 JS var。

这一行:

alert(unit.ID);

让它看起来像你相信'unit'是一个具有属性的对象。您不能直接将 PHP 对象分配给 JS 对象并期望它能够工作......

我需要查看您的一些 PHP 代码和数据结构来解释您该如何做,但这可能会有所帮助

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

或者,如果 $allNavies[unitEl] 是一个数组:

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

如果我知道 $allNavies 的结构是什么,我可能会提供最大的帮助。

另外,我很好奇......你的 {literal} 标记在哪里,以防止 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}
于 2011-03-11T19:29:59.453 回答