如何为observableArray创建自定义绑定

Mar*_*son 0 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);
Run Code Online (Sandbox Code Playgroud)

每当a Person添加到项目时,我想自动将其Parent属性设置为要添加到的项目.(在我的实际应用程序中,这是一个深层次结构,所以我不能只是对父代进行硬编码).

我正在考虑编写一个客户绑定来制作我自己的observableArray.每当添加任何内容时,自定义绑定将设置该Parent属性.我查看了http://knockoutjs.com/documentation/custom-bindings.html但这似乎只涉及正常的可观察属性.

那么我该如何做到这一点,还是有更好的方法来实现这一目标,我不知道了?

谢谢!

Ewo*_*out 6

自定义绑定是错误的做法.绑定确定observable 如何绑定到DOM元素,例如value绑定将保持表单字段的值与observable同步,visible绑定将隐藏或显示DOM元素,具体取决于observable的值.

在将Person添加到集合时在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);
   }
 }
Run Code Online (Sandbox Code Playgroud)