Я часто использую этот шаблон «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.
Мои вопросы:
- Есть ли способрешить эту проблему, используя синтаксис Razor?
- Есть ли другой / лучший способ справиться с этими сценариями (с помощью магии Javascript), без необходимости писать полноценный плагин / виджет / библиотеку JS (может показаться слишком много для каждоготакой локализованный / специфичный для страницы фрагмент скрипта)?