在MVVM(特别是Knockout.js)的集合中,我应该将模型的视图特定属性放在哪里?

在MVVM(特别是Knockout.js)的集合中,我应该将模型的视图特定属性放在哪里?,mvvm,knockout.js,Mvvm,Knockout.js,假设我有一组人模(如下所示): 使用以下HTML: <ul data-bind="foreach: people"> <li> <span data-bind="text: name"></span> <ul data-bind="visible: isVisible"> <li> <span data-bind="

假设我有一组人模(如下所示):

使用以下HTML:

    <ul data-bind="foreach: people">
    <li>
        <span data-bind="text: name"></span>
        <ul data-bind="visible: isVisible">
            <li>
                <span data-bind="text: age"></span>
            </li>
        </ul>
    </li>
</ul>
我应该把
isVisible
放在哪里

模型-把它放在模型上似乎是错误的,因为它与人无关

视图模型-我需要每个人都有它,所以将它放在视图模型上是行不通的


我认为您混淆了Model和ViewModel。在您的例子中,模型是ViewModel,您所称的ViewModel是ViewModel的一个实例,也就是说,一旦您定义了具有ko.observables的对象,它就是一个仅在客户端使用的ViewModel。您需要的任何数据绑定属性都应该在ViewModel上定义。因此,总而言之,您应该在Person对象定义中将isVisible定义为可观察值或计算值,具体取决于您的需求。

没有JavaScript中的模型。只要有一个视图模型。您的模型应该只存在于服务器上,您实际上在服务器上存储对象

在本例中,Person实际上是一个视图模型。然后可以在主视图模型中放置许多Person对象,但每个Person仍然是一个视图模型


因此,请将isVisible属性放在Person视图模型上。

还应尝试使用一个与业务规则关联度大于isVisible的名称。isVible是视图特定的信息,例如,在ViewModel中,bool成员可能被称为有效、活动或类似。然后绑定到可见的binding@Anders我可能应该在问题中说明这一点。我曾考虑将isVisible用于折叠/展开操作,在这种情况下,它完全是视图特定的(这就是为什么我不愿意将它放在Person上)。我仍然将它放在Person上,因为它是您的视图模型。如果你想让Person成为一个模特,那么你需要一个单独的PersonViewModel。但正如我所说,通常情况下,JS只包含ViewModels。您的模型仅存在于服务器上。有意义。感谢犹大。犹大的回答是正确的,我只是指出,最好给它起一个与逻辑/领域相关的名字,为什么它是可见的或不可见的。希望我能说清楚:D
    <ul data-bind="foreach: people">
    <li>
        <span data-bind="text: name"></span>
        <ul data-bind="visible: isVisible">
            <li>
                <span data-bind="text: age"></span>
            </li>
        </ul>
    </li>
</ul>