我对原生描述很陌生,对可观察对象中的可观察对象有一个问题。
我有一个带抽屉的应用程序。每个页面都通过其navigationContext从抽屉页面获取其绑定上下文。我需要一些存储在页面中的数据。所以每一页的bindingContext看起来都是这样的。。。
const viewModel = observableModule.fromObjectRecursive({
local_var1: "something as string",
local_var2: true,
globaldata: { global_var1: "global string", global_var2: true }
});
在我的xml文件中,我可以毫无问题地绑定到globaldata.global_var2。我用它来使某些部分可见或折叠。globaldata.global_var2的内容发生更改时,UI不会更新。我试着用.set("var",true(和直接设置变量。但用户界面并没有改变。为了进行测试,我尝试使用local_var2,通过这种方式,UI正在更新。
我还创建了一个非常小的游乐场。。。。
https://play.nativescript.org/?template=play-js&id=9dn3Yk&v=10
有人能向我解释一下,为什么对可观察对象内部的可观察对象的更改没有反映在UI中?
提前感谢并致以最良好的问候ingo
我在你的操场上看到了两个问题,修复这两个问题似乎可以使它按预期工作。首先,home-view-model.js
中的此代码需要更改:
var viewModel = observableModule.fromObjectRecursive({
test: { boolShow = false }
});
这应该是boolShow: false
,或者至少对我来说是成功运行的,而现有版本没有。
顺便说一下,我注意到homepage.xml
中对test.boolShow
的引用都使用了表达式:
visibility="{{ test.boolShow ? 'visible' : 'collapsed' }}"
和
text="{{ 'Touch me! ' + test.boolShow }}"
NativeScript从被引用的属性中侦听更改事件,但由于某种原因,它无法从表达式中解析它,即使它知道足够的信息来计算表达式。我看到的解决方法是先放属性键,然后放逗号,然后放表达式,如下所示:
visibility="{{ test.boolShow, test.boolShow ? 'visible' : 'collapsed' }}"
和
text="{{ test.boolShow, 'Touch me! ' + test.boolShow }}"
如果您这样做,您应该看到接口正在正确更新。我还没有看到任何关于表达式语法的好文档,但如果你把它看作是逗号运算符的使用,上面的内容是有意义的,它计算左侧,但只返回右侧。
不过,我很想看到更好的文档,因为我发现绑定系统的代码很难遵循,而且我看到的示例只涉及特定的情况,留下了许多问题没有得到解答。例如,我们可以/应该在表达式之前添加多个属性值吗?如果我提到a.b.c
,a
、b
和c
都需要是可观察的吗?或者如果只有a
和c
,它会起作用吗?如果能看到更全面的文档,那就太好了,因为这个功能被大量使用,如果使用不当,会产生明显的后果。
编辑:
再次查看文档,我对逗号运算符的评论是错误的,因为数据绑定实际上接受1、2或3个参数。然而,文档似乎仍然没有回答我上面悬而未决的问题。