如何为observableArray创建自定义绑定

时间:2011-11-09 16:46:45

标签: knockout.js

好的,问题的标题提示了我一直在考虑的一个解决方案,但这是我的问题,我愿意接受建议。

我有一个类似于此的视图模型(尽管已经过简化):

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,但这似乎只涉及正常的可观察属性。

那么我该如何做到这一点,还是有更好的方法来实现这一目标,而我却错过了?

谢谢!

1 个答案:

答案 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);
   }
 }