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>