Javascript 击倒:在单个财产中可观察到的围栏

Javascript 击倒:在单个财产中可观察到的围栏,javascript,mvvm,knockout.js,Javascript,Mvvm,Knockout.js,我的knockout视图模型变得相当大,我有几个可观察的函数和与属性BillingAddress相关的事件处理程序 例如,我有 self.BillingAddressEdit self.BillingAddressEditMode self.BillingAddressAddNew self.BillingAddressAddNewMode self.BillingAddresses self.BillingAddressesLoading …还有其他几个 我想做的是将这些集合到一个Billi

我的knockout视图模型变得相当大,我有几个可观察的函数和与属性
BillingAddress
相关的事件处理程序

例如,我有

self.BillingAddressEdit
self.BillingAddressEditMode
self.BillingAddressAddNew
self.BillingAddressAddNewMode
self.BillingAddresses
self.BillingAddressesLoading
…还有其他几个

我想做的是将这些集合到一个BillingAddress对象(或函数?)中,该对象具有与属性相同的可观察性

所以像这样的事情

self.BillingAddress = {    // or possibly function() {
    AddNew: ko.observable(),
    AddNewMode: ko.observable(),
    Addresses: ko.observableArray(),
    Edit: ko.observable(),
    EditMode: ko.observable(),
    Loading: ko.observable()
}
然后在视图上访问这些,就像这样

<tagName data-bind="foreach: BillingAddress.Addresses">
</tagName>


为了实现这一点,在我现有的视图模型中,这个
BillingAddress
对象或函数将采用什么形式?

在您的情况下
BillingAddress
可以是单个对象。当您的子视图模型被多次使用时,该函数是有用的,例如在根模型中的
observearray

更新:

self
变量用于记住viewModel的上下文。当您有一些回调时,它是有用的,这些回调可以有自己的上下文

在您的情况下,您的模型可以如下所示:

var BillingAddressViewModel = {
    AddNew: ko.observable(),
    AddNewMode: ko.observable(),
    Addresses: ko.observableArray(),
    Edit: ko.observable(),
    EditMode: ko.observable(),
    Loading: ko.observable()
}

function RootViewModel() {
    var self = this;
    self.BillingAddress = BillingAddressViewModel;
}

你能给我举个例子说明这是怎么写出来的吗?例如,我在问题中的例子是否正确?是否应该有
self.
为每个属性添加前缀?好的,我会尝试一下,并尽快报告。是的,效果很好。我不确定在我给出的例子中我做错了什么,但它现在起作用了。谢谢@Alexander。这个淘汰网站上的例子可能很有用:下面是相关的JSFIDLE,您可以对其进行分叉和修改,以将名称和子项更改为BillingAddress和Address