我希望使用data-bind
将所有eval
键值对作为对象,并将此object's
属性绑定到model
对象的相同属性。
<div data-bind="innerHTML: text, style: { color: color }"></div>
Array.prototype.slice.call(document.querySelectorAll('[data-bind]')).forEach(function (el) {
var model = { text: 'text', color : 'red' }
var boundData = eval('({' + el.getAttribute('data-bind') + '})');
}
最终结果应为:
boundData.text
等于模型的属性文本属性
boundData.color
等于模型的属性颜色属性
此示例为我提供了Uncaught ReferenceError: text is not defined
答案 0 :(得分:1)
如果你已经计划使用eval
,我想你可能不介意使用大多数JavaScripters远离的其他东西:with
。与eval
一样,with
的非常有限的使用可能是合适的。在这种情况下,它完成了这项工作:
Array.prototype.slice.call(document.querySelectorAll('[data-bind]')).forEach(function (el) {
var boundData, model = { text: 'text', color : 'red' }
with (model) {
boundData = eval('({' + el.getAttribute('data-bind') + '})');
}
});
生成的boundData
将包含innerHTML
和style
属性(其中style
是具有color
属性的对象),您必须进行调整他们要让它拥有text
和color
属性。
示例:
var dataBindValue = "innerHTML: text, style: { color: color }";
var boundData, model = { text: 'text', color : 'red' }
with (model) {
boundData = eval('({' + dataBindValue + '})');
}
snippet.log("boundData.innerHTML = " + boundData.innerHTML);
snippet.log("boundData.style.color = " + boundData.style.color);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>