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

时间:2019-03-27 15:00:12

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

,如果那是唯一的方法,请确认,但是下划线使我觉得我已经进入了数据路径的基础/受保护/非官方表示形式。还有其他方式链接已编译的vm路径吗?

1 个答案:

答案 0 :(得分:0)

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