Пространства имен Javascript с синтаксисом Razor? - PullRequest
0 голосов
/ 18 октября 2018

Я часто использую этот шаблон «Javascript namespace» в моих фрагментах скрипта, встроенных в файлы .cshtml (частичные представления):

<script type="text/javascript">
    (function (MyNamespace) {
        MyNamespace.PublicFunc1 = function (p1, p2) {
            localFunc1('abc');
            MyNamespace.PublicFunc2(p1, p2, 'abc');
        }

        MyNamespace.PublicFunc2 = function (p1, p2, p3) {
            // ...
        }

        localFunc1(p1) {
            // ...
        }
    }(window.MyNamespace = window.MyNamespace || {}));
</script>

Это работает как брелок, и я могу вызывать эти MyNamespace.PublicFunc1 и MyNamespace.PublicFunc2 функции вне этого фрагмента скрипта.

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

Чтобы решить эту проблему, я попытался использовать уникальные идентификаторы / имена пространств имен на стороне сервера для этих сценариев через синтаксис Razor, то есть:

@{
    // server-side variable with a unique namespace identifier/name
    string _namespace = Model.MyUniqueNamespace;
}

<script type="text/javascript">
    (function (@_namespace) {
        @_namespace.PublicFunc1 = function (p1, p2) {
            @_namespace.PublicFunc2(p1, p2, 'abc');
        }

        @_namespace.PublicFunc2 = function (p1, p2, p3) {
            // ...
        }

        localFunc1(p1) {
          // ...
        }
    }(window.@_namespace = window.@_namespace || {}));
</script>

Проблема этого подхода заключается в том, что вся часть @_namespace.PublicFunc1 обрабатывается Razor и на стороне сервера - что имеет смысл, но не то, что мне нужно;Мне нужно, чтобы часть @_namespace была на стороне сервера, а все остальное вокруг нее - на стороне клиента / JS.

Мои вопросы:

  1. Есть ли способрешить эту проблему, используя синтаксис Razor?
  2. Есть ли другой / лучший способ справиться с этими сценариями (с помощью магии Javascript), без необходимости писать полноценный плагин / виджет / библиотеку JS (может показаться слишком много для каждоготакой локализованный / специфичный для страницы фрагмент скрипта)?

1 Ответ

0 голосов
/ 18 октября 2018

Изменение его на @(_namespace) должно работать для вопроса 1. Для вопроса 2 важно отметить, что имя переменной, которую вы передаете в функцию, не ... действительно ... имеет значение.то есть:

(function(foo) {
  foo.func1 = function() { ... }
})(window.bar = window.bar || {});

это все равно будет установлено window.bar.func1.

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