Пути с глубокой цепочкой скомпилированных объектов модели представления

#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^[].**", ...