Использование eval для присвоения переменной методу. Как еще мне это сделать? - PullRequest
0 голосов
/ 24 января 2012

Я использую метод, чтобы принять часть идентификатора элемента и использовать его, чтобы определить, какой URL-путь мне нужно передать методу. В моем случае это используется событием нажатия на кнопку, которая может быть присоединена к любой из нескольких сеток, поэтому мне нужно знать, на какой сетке я работаю, чтобы узнать, какие данные необходимо перезагрузить:

jQuery('.reset').click(function(e) {
    e.preventDefault();
    jQuery('#' + grid_id + '_mnf').toggle();
    jQuery('#' + grid_id + '_mnfall > .instance').each(function () {
        jQuery(this).removeAttr("checked");
    });
    var url = eval(grid_id + '_url');
    jQuery('#foo').setGridParam({url:url}).trigger('reloadGrid');
});

Возможные URL определены как переменные, поэтому у меня есть что-то вроде:

var foo_url = url_path + '?input=moduleone&param=1';
var bar_url = url_path + '?input=moduleone&param=2';

Это означает, что в методе setGridParam выше значение url будет одним из этих переменных. Если я просто сделаю:

var url = grid_id + '_url'; //note I'm not using eval here

Значение, переданное setGridParam, не будет работать.

Если я не использую eval, как я делаю выше, URL не будет работать. Зачем? Что здесь происходит? Что еще я должен сделать, так как "eval is evil"?

В моем уме, без использования eval, я передаю URL как:

jQuery('#foo').setGridParam({url:foo_url}).trigger('reloadGrid'); 

но это терпит неудачу, так что, очевидно, здесь требуется eval?


Поскольку я уверен, что это слишком жесткий и неуклюжий способ сделать это, и в случае, если кто-то захочет увидеть это (и, возможно, предложить, как я делаю это неправильно?), Вот как я получаю это grid_id :

// ex. id='foo_filter'
var source = $(this).parent().parent().attr('id').split('_');

var parsed_source = source.splice(1, source.length + 1);

grid_id_portion = '';
for (var i = 0; i < parsed_source.length; i++) {
    grid_id += parsed_source[i];
    if(i < parsed_source.length - 1){
        grid_id += '_';
    }

}

Некоторые проблемы, которые я вижу ... Я должен определить URL-адреса как переменные для каждой сетки. Это довольно негибко, да? Эти URL-адреса также очень похожи, поэтому их определение кажется неэффективным. Кроме того, что если кто-то создаст специальный фрагмент кода для вставки в качестве идентификатора, который я разбиваю на части, чтобы передать eval. Это может быть плохой новостью, да? Будем весьма благодарны за любые предложения о том, как улучшить это.

1 Ответ

2 голосов
/ 24 января 2012

Используйте карту для хранения URL, а не локальных переменных.

var URLs = {
    foo: url_path + '?input=moduleone&param=1',
    bar: url_path + '?input=moduleone&param=2'
};

jQuery('.reset').click(function() {
    //do stuff...
    var url = URLs[grid_id];
    jQuery('#foo').setGridParam({url:url}).trigger('reloadGrid');
});
...