Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / использование "пространства имен" в jQuery / 13 сообщений из 13, страница 1 из 1
06.01.2013, 08:10
    #38100857
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
(сразу извиняюсь, за возможно неправильную терминологию, но надеюсь, что вопрос мой понятен будет)
У меня есть набор AJAX методов, которые выступают API.

Грубо говоря методы такие (url):
Код: sql
1.
2.
3.
4.
5.
/api/GetProducts
/api/GetCatalogs
/api/AddComment
/api/SaveState
...



вместо
Код: sql
1.
$.get('/api/GetProducts', params, function(response) {...});


и
Код: sql
1.
$.post('/api/AddComment', params, function(response) {...});



хочется как-то более унифицированно обращаться к API:
Код: sql
1.
2.
$.api.getProducts(params, function(response) {...});
$.api.addComment(params, function(response) {...});


нормально ли будет такой подход и какие недостатки?
...
Рейтинг: 0 / 0
06.01.2013, 10:06
    #38100863
iConst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
scymaks,

Ну, а о каких недостатках может идти речь в абстрактном примере?
В конечном итоге, все зависит от реализации и контекста.

Например, в АСП.Нет подобное реализовано: семейство функций по именам методов генерятся автоматически:
Namespace.MethodName([param1, param2, ...,] callback);

Если удобно - пуркуа бы не па? Непонятно только зачем это пристегивать к jQuery...
...
Рейтинг: 0 / 0
06.01.2013, 12:48
    #38100910
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
...
Рейтинг: 0 / 0
06.01.2013, 12:50
    #38100912
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
Только действительно непонятноiConstзачем это пристегивать к jQuery...
...
Рейтинг: 0 / 0
06.01.2013, 13:04
    #38100918
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
iConst,

То есть можно делать вот так:


Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
(function($) {
   window.API = new function() {
      return {
         getProducts: function(params, onSuccess) {
            $.get('/api/GetProducts', params, function(response) {
               if ($.isFunction(onSuccess)) { onSuccess(response); }
            });
         },
         addComment: function(params, onSuccess) {
            $.get('/api/GetProducts', params, function(response) {
               if ($.isFunction(onSuccess)) { onSuccess(response); }
            });
         }
      };
   };
})(jQuery);



а потом

Код: javascript
1.
2.
3.
   API.getProducts({category: 'common'}, function(response) {
      /* ... что-нибудь делаем ... */
   });



так? Это нормальный подход?
...
Рейтинг: 0 / 0
06.01.2013, 13:36
    #38100931
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
scymaks, это классический подход организации пространства имён в JavaScript.
Только зачем Вы response на верхний уровень пробрасываете?
...
Рейтинг: 0 / 0
06.01.2013, 14:59
    #38100990
iConst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
scymaksiConst,

То есть можно делать вот так:


Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
(function($) {
   window.API = new function() {
      return {
         getProducts: function(params, onSuccess) {
            $.get('/api/GetProducts', params, function(response) {
               if ($.isFunction(onSuccess)) { onSuccess(response); }
            });
         },
         addComment: function(params, onSuccess) {
            $.get('/api/GetProducts', params, function(response) {
               if ($.isFunction(onSuccess)) { onSuccess(response); }
            });
         }
      };
   };
})(jQuery);



а потом

Код: javascript
1.
2.
3.
   API.getProducts({category: 'common'}, function(response) {
      /* ... что-нибудь делаем ... */
   });



так? Это нормальный подход?Модульность - нормальный подход. В принципе - бест прексис.
Но в данном примере (опять же - неизвестен контекст):
1. проброс jQuery совершенно бессмысленен - он глобален.
2. оборачивание в замыкание - не нужно: API тоже глобальный объект
В этом ключе уместней было бы что-то вроде:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var API = (function(a) {

function setApi(meth, obj)
{
   obj[name] = function(params, onSuccess) 
   {
       $.get('/api/' + meth, params, function(response) 
       {
           if ($.isFunction(onSuccess)) onSuccess(response); 
       }
    }
}

   setApi('GetProducts', a);
   setApi('AddComment', a);

  return a;

})(API || {});

Но все равно - это переделка вашего кода на лету. И не факт, что правильно.

Если код пишется вручную - одно, если это генерится сервером - другое.
Если работаем исключительно внутри модуля - можно не возвращать объект API.
...
Рейтинг: 0 / 0
06.01.2013, 15:11
    #38101000
iConst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
поправка
Код: javascript
1.
obj[meth] = function(params, onSuccess) ...
...
Рейтинг: 0 / 0
10.01.2013, 09:44
    #38104428
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
iConst,

что-то у меня не получается так сделать...

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var a = {};

a['b'] = function() { return 1; }

console.log(a.b()); // 1

a['c'] = function() { return 'h'; }

console.log(a.c()); // "h"

var m = {f:12, g:34};

for (var i in m) {
    if (m.hasOwnProperty(i)) {
        a[i] = function() {
            return m[i];
        };
    }
}

console.log(a.f()); // 34
console.log(a.g()); // 34
console.log(a.f == a.g); // false



почему a.f и a.g выполняют один и тот же код?
...
Рейтинг: 0 / 0
10.01.2013, 10:13
    #38104455
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
scymaks, потому что на момент вызова i - это g. Изучите замыкания. Начните отсюда .
...
Рейтинг: 0 / 0
10.01.2013, 13:45
    #38104785
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
scymaksхочется как-то более унифицированно обращаться к API:
Код: sql
1.
2.
$.api.getProducts(params, function(response) {...});
$.api.addComment(params, function(response) {...});

нормально ли будет такой подход и какие недостатки?
Такой способ называется RFC/RPC - Remote Function/Procedure Call - и часто используется на практике. Все флексовские фреймворки используют такой подход для дерганий методов на сервере. Для javascript я использовал DWR - это фреймворк как раз для этого используется, правда, он заточен исключительно для Java на сервере. Думаю, для других языков аналогичные продукты тоже должны быть.

Немного крутил его, реализация не такая примитивная - там гибкость достигается за счет того, что на сервере определяются методы, которые можно "дергать" с клиента (в т.ч. аннотациями) и при компиляции и запуске проекта создается бин, где собран весь референс на методы. А когда клиент обращается за требуемыми js-файлами, сервер динамически их отдает. Таким образом, на клиенте нет жесткой привязки к конкретным прописанным методам - это делает проект крайне гибким. Но сам js-функционал статичен, все делает сервер. Библиотека достаточно большая, там много всякого сопутствующего, в том числе server push на long polling, но проект зарекомендовал себя неплохо - пожалуй, самое популярное решение в данной области.

Что мне импонирует еще в нем, так это еще одно удобство: к примеру, имеем форму на странице; при корректном вводе страница или перегрузится, или загрузится новая, но вот валидацию часто делают через ajax - юзабилити выше. Однако при таком подходе (если ничего не предпринимать) данные в строках ввода не сохраняются для дальнейшего браузер-suggestion, в том числе хранение данных форм, что напрягает. Если нужна динамическая валидация и автозаполнение форм, то приходится задействовать схему взаимодействия не через ajax, а через target формы в лице iframe (можно и динамического) - это на корню убивает всю прелесть использования ajax за его неприменимостью. А вот используя DWR, удается еще и рыбку съесть - форма отправлена путем вызова референсного серверного метода, возвращен ответ сервера, можно задействовать кучу хандлеров и автозаполнение форм работает. Можно, конечно, и самому ... но из коробки приятнее.
...
Рейтинг: 0 / 0
10.01.2013, 19:51
    #38105489
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
IDVsbruck,

У нас как раз сервер на Java (Tomcat). Но сейчас проект уже в стадии завершения, в будущем проекте обязательно попробую этот framework!
...
Рейтинг: 0 / 0
10.01.2013, 20:11
    #38105518
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
использование "пространства имен" в jQuery
О! Тогда это именно оно. Запуск за 3 минуты, море примеров на родном сайте, адаптация под любой серверный фреймворк (я к спрингу его цеплял), аннотационное декларирование. Правда, на клиенте у них только или нативное использование, или под DOJO. Но в отсутствии зависимостей от другого продукта есть свои плюсы.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / использование "пространства имен" в jQuery / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]