2010-11-11 47 views
0

Original codeJamieMThomas,一个(真正的好人,谁是试图微软JQuery的模板和链接合并):JavaScript杂技:如何将对象文字分配给评估属性?

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); 
    } 
}; 

很明显,左侧的分配无效。我怎么能做到这一点?

回答

3

你可以把整个指派在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 }');