Форматирование JavaScript для представлений MVC3 - PullRequest
4 голосов
/ 05 сентября 2011

Я пробовал много разных способов организовать JavaScript, специфичный для каждого View, но я не нашел способа, который бы мне нравился.Это кажется грязным в любом случае.Возможно (и надеюсь) это потому, что я не очень долго работал с JavaScript, и есть хороший способ сделать это.

В настоящее время я делаю вот что:

В моем файле Layout у меня есть RenderSection для скриптов в дополнение к RenderBody.Этот раздел содержит весь JavaScript, относящийся к каждому отдельному представлению.Глобальный скрипт спрятан в своем собственном файле.

Внутри этих разделов много разных частей JavaScript (для моего самого большого представления в настоящее время существует около 600 строк JavaScript):

  • Некоторые определения переменных и установка различных настроек (среди прочего, настройки jQuery).
  • Скрытие различных элементов DOM на экране, которые будут видны при взаимодействии пользователя с представлением позже.
  • Большое количество кода jQuery для различных событий, связанных с элементами DOM (click / keyup ++)
  • Некоторый код реорганизован в методы, поскольку они используются различными событиями jQuery.

ВещиМне не нравятся здесь в основном две вещи:

  • Весь этот код помещен в один большой кодовый блок, и трудно найти части скрипта, которые я ищу.По сути, он становится совершенно не поддерживаемым по мере роста скрипта.
  • Скрипт находится в том же файле, что и View.Я хотел бы поместить сценарий в отдельный файл, но не могу, поскольку я использую разные части моей модели, а также некоторые HtmlHelpers внутри сценария.Например, когда я выполняю несколько вызовов $ .post, я использую @Url.Action('...'), чтобы связать его с правильным методом действия, чтобы быть уверенным, что мой сценарий продолжит работать, даже если я изменю свою маршрутизацию.Я также использую Модель, чтобы решить, должны ли некоторые элементы начинаться скрытно или нет, как это (это нормальный способ сделать его скрытым, или есть ли лучший способ?мой палец на нем).:

код

@if( Model.SomeBoolValue ){
  @:$("#DOMelementID").hide();
}

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

Ответы [ 2 ]

4 голосов
/ 05 сентября 2011

Я бы порекомендовал вам взглянуть на jQuery-разработку плагинов и упорядочить свой код javascript в виде плагинов, которые вы будете прикреплять к своим элементам DOM.

Что касается @Url.Action('...') проблема связана с тем, что есть много способов решить эту проблему и перенести ваши сценарии в отдельные файлы.Например, давайте предположим, что вы AJAXифицируете существующую форму или ActionLink, который уже содержит URL:

$('#myAnchor').click(function() {
    // use this.href to fetch the url
    $.post(this.href, function(result) {

    });
    return false;
});

Теперь, если вы просто хотите отправить AJAX-запрос, когда пользователь, например, нажимает на div, вы можетевсегда используйте атрибуты data- * HTML5 (так же, как ненавязчивый AJAX и валидация ASP.NET MVC 3), чтобы определить этот URL для элемента DOM:

<div id="mydiv" data-url="@Url.Action("Some Action")">click me</div>

и теперь в отдельном файле

$('#mydiv').click(function() {
    var url = $(this).data('url');
    $.post(url, function(result) {

    });
});

и если вы будете следовать моему первому совету по написанию плагина jQuery, ваш код будет выглядеть следующим образом:

$('#mydiv').myplugin();

Теперь давайте рассмотрим следующий фрагмент:

@if(Model.SomeBoolValue) {
    @:$("#DOMelementID").hide();
}

Итакиз того, что кажется здесь, вы используете свойства модели представления, чтобы показать / скрыть разделы вашего кода.Хорошо, вот что я могу вам предложить: JSON сериализует эту модель в представление, а затем вы можете начать передавать значения из нее в ваши недавно разработанные плагины jQuery:

<script type="text/javascript">
     var model = @Html.Raw(Json.Serialize(Model));
     // now configure configure your plugins, for example
     $('#mysection').myplugin({ model: model });
</script>

Теперь внутри вашего плагина у вас будет доступ кАбсолютно все свойства модели вашего вида.

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

4 голосов
/ 05 сентября 2011

Да, это может быть сложно.

Вот что мы делаем, и работает для нас (жирным шрифтом, потому что это может не сработать для вас).

Для каждого просмотра / страницы мы выясняем, какие свойства модели требуются JavaScript для принятия решений (или «логика»).

У нас также есть раздел в макете для JavaScript.

Затем мы устанавливаем одно свойство JavaScript в View / page, инкапсулируя эти свойства, что-то вроде этого:

@section JavaScript {
   <script type="text/javascript">
      yn.yp = {
          someBoolValue: @Model.SomeBoolValue,
          someOtheProp: '@Model.SomeOtherProp'
      }
   </script>
}

yn = ваше пространство имен, связывая глобальное пространство имен для вашего проекта / компании.yp = ваша страница, для которой вы устанавливаете свойство JS.

Затем во внешнем файле JS:

$(function() {
   if (yn.yp.someBoolValue) {
      $("#elementid").hide();
   }
});

Это также очень чистый способ обрабатывать URL-адреса маршрутизации, которые будут использоваться клиентским AJAX.Установите свойство, например yn.yp.urls, и укажите там URL-адреса в представлении, после чего JS сможет получить к ним доступ легко и без какого-либо жесткого кодирования.

В целом, цель здесь состоит в сокращении серверной части.код во встроенной странице JavaScript.

Установите свойства для всего, что JS необходимо для принятия решений, затем позвольте JS принимать решения самостоятельно.

Надеюсь, что это имеет смысл.

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