"Eval is зло", но у меня есть выбор? - PullRequest
0 голосов
/ 17 ноября 2011

Я придумал какое-то нестандартное решение для локализации проекта, над которым я работаю.Идея состоит в том, что мой HTML может содержать следующее:

<h2 data-l10n="HELLO" data-l10n-params="['Visitor', new Date()]"></h2>

Когда страница запускается, запускается функция javascript, подобная этой:

localizeAll: function(sel) {
    var selector = sel || document,
        $o = $(selector);

    $o.find('[data-l10n]').each(
    function() {
        var $t = $(this),
            val = $t.attr('data-l10n'),
            params = $t.attr('data-l10n-params'),
            po = null;

        if (typeof params !== 'undefined') {
            po = eval(params);
            log(params, po);
        }

        var res = doLocalize(val, po);

        if (res[0] !== '<') {
            $t.text(res);
        } else {
            $t.text(val);
        }
    });

}

Так что в основном мы ищем любые элементы, которые имеютdata-l10n -атрибут и вызов doLocalize() для каждого из этих объектов.Кроме того, элемент может иметь data-l10n-params -атрибут, который является просто строковым литералом, который может быть проанализирован в массиве.Эта строка оценивается (params строка становится po массивом), а po передается в doLocalize() в качестве необязательного второго параметра.

Следовательно, вывод в Firebug (из оператора log(params, po);):

['Vistor', new Date()] ["Vistor", Date {Thu Nov 17 2011 10:10:31 GMT+0100 (CET)}]

Так что да, я использую eval.И да, я знаю, что "Eval - это зло".Но иногда мне нужно передать параметр в doLocalize().

Как это можно сделать без eval?

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Я думаю, что ваша проблема в том, что вы эффективно внедряете JavaScript в HTML (что противоречит ненавязчивому принципу JavaScript ).

На вашем месте я бы добавил дополнительный l18n-params.js файл со следующим содержанием:

var dataL10Nparams = {
    HELLO = ['Visitor', new Date()]
}

Теперь вместо чтения параметров из атрибута HTML и оценки просто вызовите:

dataL10Nparams['HELLO']
2 голосов
/ 17 ноября 2011

Если вы предоставляете только параметризованные значения в своем атрибуте HTML, рассмотрите возможность использования JSON.parse () вместо оценки.

...