代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

JavaScript acrobatics:如何将对象文本赋给评估属性?

  •  0
  • Zachary Scott  · 技术社区  · 14 年前

    Original code JamieMThomas ,一个(非常好的人,他正试图结合微软JQuery模板和链接):

    mapping[binding.field] = {
        convert: function (value, source, target) {
            if (binding.converter && binding.converter.convert) {
                value = binding.converter.convert(value, source, target)
                    if (value === undefined)
                        return;
            }
            $(target).attr(attrName, value);
        }
    };
    

    我想把它砍下来 binding.field 使用类似于 "LPC[0].itemid" (字面意思是字符串)。我正在使用eval作为一个糟糕的选择,但它是我能做的最快的事情(稍后将重写它)。我最初尝试将内容分配给eval('')本身,但它不允许我这样做。

    eval('(mapping.' + binding.field + ')') =
        { // rest is the same
        convert: function (value, source, target) {
            if (binding.converter && binding.converter.convert) {
                value = binding.converter.convert(value, source, target)
                    if (value === undefined)
                        return;
            }
            $(target).attr(attrName, value);
        }
    };
    

    很明显左边的作业是无效的。我怎么能做到这一点?

    1 回复  |  直到 14 年前
        1
  •  3
  •   SLaks    14 年前

    你可以把整个作业放在 eval :

    eval('mapping.' + binding.field + ' = { ... }');
    

    这将是一个包含函数定义的非常大的字符串
    要使字符串变小,可以将函数放在外部变量中:

    var converter = function (value, source, target) {
        if (binding.converter && binding.converter.convert) {
            value = binding.converter.convert(value, source, target)
                if (value === undefined)
                    return;
        }
        $(target).attr(attrName, value);
    };
    eval('mapping.' + binding.field + ' = { convert: converter }');