好的,问题的标题提示了我一直在考虑的一个解决方案,但这是我的问题,我愿意接受建议。
我有一个类似于此的视图模型(尽管已经过简化):
var viewModel = {
items: ko.observableArray([new Person('fred'), new Person('Joe')]),
name: ko.observable('hello world')
};
function Person(name)
{
this.Name = ko.observable(name);
this.Parent = ko.observable();
}
ko.applyBindings(viewModel);
只要将Person
添加到项目中,我就会自动将其Parent
属性设置为要添加到的项目。 (在我的实际应用程序中,这是一个深层次结构,所以我不能只是对父代进行硬编码。)
我正在考虑编写一个客户绑定来制作我自己的observableArray。每当添加任何内容时,自定义绑定将设置Parent
属性。我看过http://knockoutjs.com/documentation/custom-bindings.html,但这似乎只涉及正常的可观察属性。
那么我该如何做到这一点,还是有更好的方法来实现这一目标,而我却错过了?
谢谢!
答案 0 :(得分:5)
自定义绑定是错误的。绑定确定如何将一个observable绑定到DOM元素,例如value
绑定将使表单字段的值与可观察的visible
绑定保持同步将隐藏或显示DOM元素,具体取决于observable的值。
当您在添加到集合时在Person上设置属性这一事实是您的用户界面不应该知道的实现细节。我的建议是订阅observableArray并在添加Person时手动设置Parent属性。在代码中:
viewModel.items.subscribe(function(new_array) {
for (var i=0 ; i < new_array.length ; ++i) {
if (!new_array[i].Parent())
new_array[i].Parent(items);
}
}