Javascript ily ViewModel都是viewmodels,名称validI也有相同的混淆。我认为选举是为了家庭,不是为了孩子。这是不需要的,但是如果有人想将它与直接在select的值绑定中设置selected observable结合起来,他们可以这样做:我从本

Javascript ily ViewModel都是viewmodels,名称validI也有相同的混淆。我认为选举是为了家庭,不是为了孩子。这是不需要的,但是如果有人想将它与直接在select的值绑定中设置selected observable结合起来,他们可以这样做:我从本,javascript,knockout.js,Javascript,Knockout.js,ily ViewModel都是viewmodels,名称validI也有相同的混淆。我认为选举是为了家庭,不是为了孩子。这是不需要的,但是如果有人想将它与直接在select的值绑定中设置selected observable结合起来,他们可以这样做:我从本地测试代码中留下了u.bind()内容,使用u.each()很方便(我忘了ko.utils的版本)。诚然,这是一个人为的例子。我现在来看看你的变化。谢谢你的回答。是的,当然是你的改变让它起作用了。不过,我可能应该更清楚,在我的非人工、更复杂的应


ily ViewModel都是viewmodels,名称validI也有相同的混淆。我认为选举是为了家庭,不是为了孩子。这是不需要的,但是如果有人想将它与直接在select的值绑定中设置selected observable结合起来,他们可以这样做:我从本地测试代码中留下了u.bind()内容,使用u.each()很方便(我忘了ko.utils的版本)。诚然,这是一个人为的例子。我现在来看看你的变化。谢谢你的回答。是的,当然是你的改变让它起作用了。不过,我可能应该更清楚,在我的非人工、更复杂的应用程序中,我实际上对依赖项进行了计算,所以我无法将这种逻辑推到视图中。(这是一个带有日期的下拉列表,我必须对当前值进行日期计算。)@Dennis,因此isSelected确实需要位于子对象上,因为该对象被丢弃/重新创建。是的,我知道是人为的。订阅然后设置isSelected是我尝试过的,但它似乎产生了同样的依赖性。实际上,我不认为我在这个小例子中尝试过。我必须试一试。果然,订阅和推动isSelected()更改工作正常@丹尼斯,如果你想把它变成一个答案,我会接受的。不幸的是,我不能使用传入一个可观察项的自动依赖项(如我发布的原始JSFIDLE)并以某种方式清理它,因为这是我不愿意做的更多的“连接”代码。但它是有效的!非常感谢。非常彻底。关于绑定的还有很好的提示。这使得被调用的函数更有意义。与在
foreach
上使用
as
相同。有意义的上下文非常有用,尤其是当标记变大时。关于所选的
|
在每个孩子身上,这在本例中是很奇怪的,而且是人为的,因为我的真实场景确实要求“孩子”能够访问所讨论的财产。另一种可能性是:
function FamilyViewModel(name) {
    this.name = name;
    this.children = ko.observableArray();
}

function ChildViewModel(firstName, lastName, selectedFamilyObservable) {
    this.firstName = ko.observable(firstName);
    this.lastName = ko.observable(lastName);
    this.fullName = ko.computed(function() {
        return this.firstName() + " " + this.lastName();
    }, this);
    this.isSelected = ko.computed(function() {
        return selectedFamilyObservable().name == this.lastName();
    }, this);
}

function PageViewModel() {
    this.families = ko.observableArray([
            new FamilyViewModel("Smith"),
            new FamilyViewModel("Jones"),
            new FamilyViewModel("Brown")
            ]);
    this.selectedFamily = ko.observable();
    this.addChild = _.bind(function() {
        this.selectedFamily().children.push(new ChildViewModel("Frank", this.selectedFamily().name, this.selectedFamily));
    }, this);
    this.resetChildren = _.bind(function() {
        this.selectedFamily().children([]);
    }, this);
}

$(function() {
    ko.applyBindings(new PageViewModel());
});
 var addChild = function () {
      self.selectedFamily().push(new childModel(self.selectedFamily().name());
 };
self.selectedFamily = ko.observable();
self.selectedFamily.subscribe(function (oldValue) {
    if (oldValue) {
        oldValue.isSelected(false);
    }
}, null, 'beforeChange');
self.selectedFamily.subscribe(function (newValue) {
    if (newValue) {
       newValue.isSelected(true);
    }
});
var _selectedFamily = ko.observable();
self.selectedFamily = ko.computed({
    read: _selectedFamily,
    write: function (newValue) {
        var oldValue = _selectedFamily();
        if (oldValue) {
            oldValue.isSelected(false);
        }
        if (newValue) {
           newValue.isSelected(true);
        }
        _selectedFamily(newValue);
    }
});
self.addChild = function () {
    var selectedFamily = self.selectedFamily();
    // ...code...
};
self.addChild = function (selectedFamily) {
};
<li data-bind="text: fullName"><span data-bind="visible: $parent.isSelected">| Selected!</span></li>
<div data-bind="foreach: { data: $root.families, as: 'family' }">
    <ul data-bind="foreach: { data: $family.children, as: 'child }>
        <li>
            <span data-bind="text: child.firstName">
            <span data-bind="text: family.name">
        </li>
    </ul>
</div>