gpt4 book ai didi

javascript - knockout 可观察数组计算

转载 作者:行者123 更新时间:2023-11-30 00:22:11 25 4
gpt4 key购买 nike

我正在尝试为 observableArray 实现一个简单的“toString”函数。

当使用这个对我来说最合适的代码时

var viewModel = {

name: ko.observable('test'),
arr: ko.observableArray(['item1']),

third: ko.computed(function(){

return this.arr().join();
})
};

ko.applyBindings(viewModel);

得到一个this.arr is not a function错误

为什么会这样?

如果我这样运行它,一切正常。

var viewModel = {

name: ko.observable('test'),
arr: ko.observableArray(['item1']),

third: function(){

return this.arr().join();
}
};

ko.applyBindings(viewModel);

如果我使用第二种方法,我会得到正确的 arr 内容吗?每次从 arr 添加/删除项目时,第三个变量都会更新吗?

https://jsfiddle.net/zek2kz2b/5/

最佳答案

发生的事情是您计算的 this 不是 View 模型,因此它没有 arr 方法。

您需要为您的计算提供 this 上下文,以便在它被调用时使用。您可以通过在 ko.computed 调用中向 View 模型传递第二个参数来完成此操作。

但是因为您将 View 模型创建为普通对象,所以在调用 ko.computed 时您没有要传递的 View 模型。因此,改为将 View 模型创建为构造函数:

function ViewModel() {
var self = this; // Capture the view model as self to simplify things
self.name = ko.observable('test'),
self.arr = ko.observableArray(['item1']),
self.third = ko.computed(function(){
return this.arr().join();
}, self); // We now have the view model available to pass here
};
ko.applyBindings(new ViewModel());

另一种方法是简单地将 self 引用引用到计算中的 View 模型:

function ViewModel() {
var self = this;
self.name = ko.observable('test'),
self.arr = ko.observableArray(['item1']),
self.third = ko.computed(function(){
return self.arr().join();
});
};
ko.applyBindings(new ViewModel());

关于javascript - knockout 可观察数组计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com