Глубокие цепочки путей с объектами модели скомпилированного представления - PullRequest
0 голосов
/ 27 марта 2019

Учитывая иерархию модели скомпилированного представления, созданную с использованием этих данных:

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

, и если это единственный способ, пожалуйста, подтвердите, но подчеркивание заставляет меня чувствовать, что я подключился к основному / защищенному/ неофициальное представление пути данных.Любой другой способ связать скомпилированные пути VM?

1 Ответ

0 голосов
/ 30 марта 2019

Учитывая, что 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 () для виртуальных машин), тогда вы будете Нужно поставить ^ на соответствующем уровне в пути, чтобы прослушать любые изменения ниже этого уровня. Например, вы можете написать

$.observe(data.applications(), "[]^_settings.[].*", ...

или

$.observe(data.applications(), "^[]._settings.[].*", ...

или

$.observe(data, "_applications^[]._settings.[].*", ...

Другим вариантом является ** подстановочный знак - который вы можете использовать на любом уровне, чтобы показать все изменения ниже этого уровня:

$.observe(data.applications(), "**", ...

или

$.observe(data, "**", ...

или

$.observe(data, "_applications^[].**", ...
...