#jsviews
#jsviews
Вопрос:
Учитывая иерархию скомпилированной модели представления, созданную с использованием этих данных:
"applications":[
{
"application_id":1,
"name":"Test Application 1",
"description":"An Application For Testing",
"settings":[
{
"name":"Application 1 Setting Key 1",
"value":"Application 1 Setting Value 1"
}
],
"projects":[
{
"project_id":1,
"name":"Test Project 1",
"description":"A project for testing 1",
"settings":[
{
"name":"Project 1 Setting Key 1",
"value":"Project 1 Setting Value 1"
}
]
}
]
}
]
У меня возникают трудности с подключением к наблюдаемым на уровнях, расположенных дальше в дереве.
Нет проблем с наблюдением за изменениями свойств приложения:
$.observe(data.applications(), ".[]^*", ...
Но как насчет изменений свойств настройки в приложении? Все это сбой:
$.observe(data.applications().settings(), ".[]^*", ...
$.observe(data.applications(), ".settings.[]^*", ...
$.observe(data.applications(), ".settings().[]^*", ...
Я вижу, что в документации конкретно упоминается, что круглые скобки не будут работать в цепных путях, подобных последнему примеру, поэтому на этот последний надежды было мало.
Кажется, мне это сходит с рук:
$.observe(data.applications(), ".[]._settings.[]^*", ...
и если это единственный способ, пожалуйста, подтвердите, но подчеркивание заставляет меня чувствовать, что я подключился к базовому / защищенному / неофициальному представлению пути к данным. Есть ли другой способ связать скомпилированные пути к виртуальной машине?
Ответ №1:
Учитывая, что applications()
возвращает массив, как это делает settings()
, вы не можете написать:
$.observe(data.applications().settings(), "[]^*", ...
Если вы хотите настроить таргетинг на конкретное приложение, например data.applications()[0]
, вы могли бы написать:
$.observe(data.applications()[0].settings(), "[]^*", ...
Если вы хотите настроить таргетинг на все свойства настроек в любом приложении, вы можете написать:
$.observe(data.applications(), "[]._settings.[]^*", ...
Вы правы, что _settings
должно быть «внутренним». Предполагаемый дизайн действительно должен был позволить вам писать:
$.observe(data.applications(), "[].settings.[]^*", ...
но в настоящее время существует ошибка, которая не позволяет этому работать. Предстоящее обновление либо исправит эту ошибку, либо предложит немного другой шаблон. На данный момент было бы лучше остаться с _settings
, который в любом случае продолжит работать после следующего обновления. После следующего обновления также обратите внимание на возможные новые разделы документации по [].*
подстановочным знакам и другим связанным функциям…
Кстати, если вы хотите прослушать изменения после изменения иерархии данных выше (например, applications()
массива — который вы могли бы изменить с помощью функции merge() для виртуальных машин), то вам нужно будет поместить ^
на соответствующий уровень в path, чтобы прослушать любые изменения ниже этого уровня. Например, вы можете написать
$.observe(data.applications(), "[]^_settings.[].*", ...
или
$.observe(data.applications(), "^[]._settings.[].*", ...
или
$.observe(data, "_applications^[]._settings.[].*", ...
Другим вариантом является **
подстановочный знак, который вы можете использовать на любом уровне, чтобы показать все изменения ниже этого уровня:
$.observe(data.applications(), "**", ...
или
$.observe(data, "**", ...
или
$.observe(data, "_applications^[].**", ...