Лучшие практики с кодом привязки формы jQuery в приложении - PullRequest
5 голосов
/ 29 августа 2008

У нас есть приложение с большим количеством jQuery JSON-вызовов кода на стороне сервера. Из-за этого у нас есть большой объем связывающего кода для анализа ответов и привязки соответствующих значений к форме. Это вопрос из двух частей.

  1. Каков рекомендуемый подход для работы с большим количеством форм, которые имеют разные данные. Прямо сейчас мы пытаемся использовать структурированный подход при настройке js-класса для каждой страницы, с init, wireClickEvents и т. Д., Чтобы попытаться привести все в соответствие.

  2. Существуют ли "лучшие практики" по созданию повторяющегося кода jQuery или какого-либо рекомендованного типа структуры, кроме простого добавления нескольких функций в файл js?

Ответы [ 3 ]

5 голосов
/ 07 января 2011

Вероятно, вам следует взглянуть на фреймворк, например knockout.js Таким образом, вы можете просто обновить свои модели, и формы будут обновляться автоматически.

2 голосов
/ 29 августа 2008

Не на 100% верный пример того, что вы просите, но лично, и я использую MochiKit, я создаю «классы» JavaScript (или виджеты, если вы предпочитаете) для каждой существенной структуры пользовательского интерфейса. Они, конечно, знают, как заполнить себя данными.

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

Я не сплю ночью по этому поводу? :)


РЕДАКТИРОВАТЬ: Другими словами, да - делать то, что вы делаете, по большей части. Я вижу, что слишком много начинающих хакеров JavaScript пишут кучу плохо связанных функций, которые, кажется, не являются частью чего-то особенного, кроме того, что все они находятся в одном файле. Надеюсь, что это имеет смысл.

0 голосов
/ 07 января 2011

Я думаю, что у вас есть несколько проблем. Первый вопрос заключается в том, как структурировать код javascript, то есть, как создавать пространства имен, чтобы вы не боролись со столкновениями имен или не называли свои функции как

form1validate
form1aftersubmit
form2validate
form2aftersubmit

Одним из проверенных шаблонов для модулей в javascript является использование анонимной функции для создания новой области именования. Основная идея показана в следующем коде

(function() {
  var foo = 1;
})();

(function() {
  if(foo == 1) alert("namespace separation failed!")
})();

Я думаю, что запись в блоге - хорошее введение.

Второй вопрос, с которым вы сталкиваетесь, заключается в том, как избежать всего повторения в коде javascript. У вас есть пара видов оружия против этого.

  1. функции - это очевидно, но часто забывают реорганизовать общий код в функции, где это можно сделать. В вашем случае это будут функции для копирования значений из ответа json в формы и тому подобное
  2. функция высшего порядка - или функции в качестве данных - или обратный вызов, как их часто называют в javascript. Это самое мощное оружие в javascript. В случае обработки форм и ajax вы можете использовать обратный вызов, чтобы избежать повторения в потоке управления вашими формами.

Позвольте мне построить пример из моей головы (используя jquery для убедительности)

// this is a validator for one form
   var form1validator = function() {
     if($("input[name=name]",this).attr("value").length < 1 &&
        $("input[name=organisation]",this).attr("value").length < 1)
       return "Either name or organisation required" 
   }

   // and this for a second form
   var form2validator = function() {
     if($("input[name=age]",this).attr("value").length < 21
       return "Age of 21 required"
   }

   // and a function to display a validation result
   var displayResult = function(r) {
     $(this).prepend("<span></span>").text(r);
   }

   // we use them as higher order functions like that

   $("#form1").onSubmit(validator(form1validator, displayResult, function() {
     //on submit
     ...send some xhr request or like that
   });

   $("#form2").onSubmit(validator(form2validator, displayResult, function() {
     this.submit() // simply submit form
   });

   $("#form1b").onSubmit(validator(form1validator, function(r) {
     alert("There was an validation error " + r);
   }, function() {
     //on submit
     ...send some xhr request or like that
   });


   // the validator function itself would be defined as

   function validator(formValidator, displayResult, onSubmit) {
     var r = formValidator.apply(this)
     if(typeof(r) === 'undefined')
       onSubmit(this)
     else
       displayResult(r)
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...