【问题标题】:Deep chained paths with compiled view model objects具有编译视图模型对象的深度链接路径
【发布时间】:2019-03-27 15:00:11
【问题描述】:

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

"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"
              }
           ]
        }
     ]
  }
]

我很难在树中更远的层次上挖掘 observables。

观察应用程序属性的变化没有问题:

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

但是如何更改应用程序下的设置属性呢?这些都是失败的:

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

我看到文档特别提到括号不会像上一个示例那样在链式路径中起作用,因此对最后一个没有太大希望。

我似乎能够摆脱这个:

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

如果这是唯一的方法,请确认,但下划线让我觉得我已经利用了数据路径的底层/受保护/非官方表示。还有其他方法可以链接已编译的 vm 路径吗?

【问题讨论】:

    标签: jsviews


    【解决方案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() feature 对 VM 进行更改),那么您需要放置一个 ^在路径中的适当级别,以听取低于该级别的任何更改。比如你可以写

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 2017-09-16
      相关资源
      最近更新 更多