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

时间:2013-01-02 19:57:44

标签: mvvm knockout.js

假设我有一个人物模型的ko.observableArray(下面):

// Model
var Person = function () {
    this.name = ko.observable();
    this.age = ko.observable();
};

// View Model
var viewModel = {
    people: ko.observableArray([
        new Person("Bob", 21),
        new Person("Bill", 25)
    ])
};

使用以下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

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

查看模型 - 我需要将其设置为每个人,因此将其放在视图模型上是行不通的。

Fiddle

2 个答案:

答案 0 :(得分:1)

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

在这种情况下,Person实际上是一个视图模型。然后,您可以在主视图模型中放置大量Person对象,但每个人仍然是视图模型。

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

答案 1 :(得分:0)

我认为你在Model和ViewModel之间感到困惑。在您的情况下,Model是ViewModel,您所谓的viewModel是ViewModel的一个实例,即,一旦您使用ko.observables定义对象,它就是仅在客户端使用的ViewModel。您需要的任何数据绑定属性都应在ViewModel上定义。因此,总之,您应该根据您的要求将Person对象定义中的isVisible定义为可观察值或计算值。