具有已编译视图模型对象的深层链接路径

Deep chained paths with compiled view model objects

给定使用此数据实例化的编译视图模型层次结构:

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

如果这是唯一的方法,请确认,但下划线让我觉得我已经进入了数据路径的 underlying/protected/unofficial 表示。链接编译的虚拟机路径的任何其他方式?

鉴于 applications() returns 是一个数组,settings() 也是,你不能写:

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

如果你想针对特定的应用程序,例如data.applications()[0],你可以写:

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

如果要针对任意应用下的所有设置属性,可以这样写:

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

你是对的 _settings 应该是 'internal'。预期的设计确实是让你写:

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

但是目前有一个错误阻止了它的工作。即将发布的更新将修复此错误,或提出略有不同的模式。现在最好继续使用 _settings,无论如何它将在下一次更新后继续工作。在下一次更新后,还要注意有关 [].* 通配符和其他相关功能的可能的新文档主题...

顺便说一句,如果你想在修改更高层的数据层次结构后收听变化(例如 applications() 数组 - 你可能会使用 merge() feature 来更改虚拟机),那么你将需要将 ^ 放在路径中的适当级别,以收听该级别以下的任何更改。例如你可以写

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

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

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

另一个选项是 ** 通配符 - 您可以在任何级别使用它来显示该级别以下的所有更改:

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

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

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