Какой простой способ заставить сервер возвращать функцию JavaScript, которая затем будет вызвана? - PullRequest
5 голосов
/ 10 июня 2010

Мое приложение спроектировано как множество плагинов, которые еще не были написаны. Для этого есть длинная причина, но с каждым новым годом бизнес-логика будет отличаться, и мы не знаем, как это будет выглядеть (подумайте о TurboTax, если это поможет). Плагины состоят из серверного и клиентского компонентов. Компоненты сервера имеют дело с бизнес-логикой и сохранением данных в таблицах базы данных, которые также будут созданы позже. JavaScript манипулирует DOM, чтобы браузеры отображали его позже.

Каждый плагин находится в отдельной сборке, чтобы он не мешал основному приложению, т. Е. Мы не хотим перекомпилировать основное приложение. Короче говоря, я ищу способ вернуть функции JavaScript клиенту из запроса get Ajax и выполнить эти функции JavaScript (которые только что были возвращены). Вызвать функцию в Javascript легко. Сложная часть - как организовать или структурировать, чтобы мне не пришлось иметь дело с проблемой обслуживания. Таким образом, использование метода StringBuilder для получения кода JavaScript в результате вызова toString () из объекта компоновщика строк исключено.

Я хочу, чтобы между написанием кодов JavaScript и написанием кодов Javascript для этой динамической цели не было разницы.

Альтернативой является манипулирование DOM на стороне сервера, но я сомневаюсь, что это будет так же элегантно, как использование jQuery на стороне клиента. Я открыт для библиотеки C #, которая поддерживает цепные вызовы, такие как jQuery, которая также манипулирует DOM.

Есть ли у вас какие-либо идеи или это слишком много, чтобы спросить, или вы слишком запутались?

Edit1 : Смысл в том, чтобы избежать перекомпиляции, следовательно, архитектура плагинов. В некоторых других частях программы я уже использую концепцию динамической загрузки файлов Javascript. Это отлично работает. То, что я смотрю здесь, где-то в середине программы, когда Ajax-запрос отправляется на сервер.

Редактировать 2 : Чтобы проиллюстрировать мой вопрос:

Обычно вы увидите следующий код. Ajax-запрос отправляется на сервер, а JSON-результат возвращается клиенту, который затем использует jQuery для манипулирования DOM (в этом случае создает тег и добавляет его в контейнер).

var container = $('#some-existing-element-on-the-page');
$.ajax({
    type: 'get',
    url: someUrl,
    data: {'': ''},
    success: function(data) {                                                   
      var ul = $('<ul>').appendTo(container);

      var decoded = $.parseJSON(data);                
      $.each(decoded, function(i, e) {
         var li = $('<li>').text(e.FIELD1 + ',' + e.FIELD2 + ',' + e.FIELD3)
            .appendTo(ul);
      });                
    }        
});

Выше очень просто. Но в следующем году то, что возвращает сервер, будет совершенно другим, и то, как будут отображаться данные, также будет другим. В некотором смысле, это то, что я хочу:

var container = $('#some-existing-element-on-the-page');
$.ajax({
    type: 'get',
    url: someUrl,
    data: {'': ''},
    success: function(data) {                           
      var decoded = $.parseJSON(data); 
      var fx = decoded.fx;
      var data = decode.data;
      //fx is the dynamic function that create the DOM from the data and append to the existing container
      fx(container, data);                  
    }        
});

Мне не нужно знать, на что сейчас будут похожи данные, но в будущем я узнаю, и тогда я смогу написать fx соответственно.

Ответы [ 4 ]

1 голос
/ 10 июня 2010

Я сомневаюсь, что вам понадобится ajax для возврата javascript, и вы, вероятно, могли бы просто изменять файлы .js каждый год.

Обратите внимание, что ваши сценарии должны быть подписаны, если они запускаются между доменами

В любом случае, вы, вероятно, ищете EVAL, который теоретически может быть использован хакерами для работы с вашим сайтом.Это также замедлит работу и затруднит отладку ...

Опять же, вам, вероятно, не нужно загружать javascript асинхронно.Если логика меняется каждый год, это просто изменяет файлы .js.Вам нужно будет загрузить его с помощью ajax, если логика изменится, пока браузер все еще находится на странице ... что в любом случае может вызвать проблемы в пространствах имен программирования.(т. е. вы вводите новый код в живое пространство имен старого кода, а версии работают некорректно).

0 голосов
/ 11 июня 2010

Ну, отмазка просто использует eval.Отправка функции в виде строки с сервера и eval ('myhopefullyuncompromisedjavascriptcode');

success: function(data) {  
var decoded = $.parseJSON(data); 
  var fx = eval(decoded.fx); 
  //where the eval string would contain "(function(params){...})"
  var data = decode.data;
  //fx is the dynamic function that creates the DOM from the data and append to the existing container
  fx(container, data);      

Хотя альтернативы на самом деле не намного лучше.

Вы можете загружать по требованию, но на самом деле это то же самое, за исключением того, что оно инкапсулировано в .js.
Если кто-то имеет возможность возвращать случайные строковые j с вашего сайта, илиможет сделать вашу точку вызова ajax в другом месте для загрузки произвольных js, тогда они уже могут загружать свои собственные произвольные js.

С другой стороны, динамическая загрузка может сэкономить вам немного веса, поскольку вы не отправляете одну и ту же строковую функцию по проводам и не оцениваете ее снова и снова, эту же выгоду можно извлечь из поддержки клиентской части.хэш функций все же.

это немного "Мех" из моего pov.

0 голосов
/ 10 июня 2010

Похоже, вы уже определились со своей архитектурой, и вы полны решимости найти способ заставить ее работать. Но вместо того, чтобы напрямую изменять DOM, почему бы просто не сделать так, чтобы плагины возвращали соответствующий HTML и обновляли innerHTML контейнера с их выводом?

0 голосов
/ 10 июня 2010

Глупая идея, но могу ли я предложить вам вернуть href во внешний файл JS и загрузить его вместо возврата действительного кода JS?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...