Javascript 奇怪的数据绑定问题

Javascript 奇怪的数据绑定问题,javascript,knockout.js,Javascript,Knockout.js,我的代码有一个疯狂的问题。我正在努力实现 在我的代码中,但我没有成功。以下是我所做的: 视图模型: viewModelInbox = function(){ query: ko.observable(''); var checked = false, mainData = ko.observableArray([]), showView

我的代码有一个疯狂的问题。我正在努力实现

在我的代码中,但我没有成功。以下是我所做的:

视图模型:

viewModelInbox = function(){
                    query: ko.observable('');
                    var checked = false,
                    mainData = ko.observableArray([]),
                    showView = ko.observable(),
                    currentView = ko.observable(),
                    approve = function(){
                    },

                    disapprove = function(){},
                    toggle = function () {
                        if(checked){
                            $.each(mainData(), function(){
                                this.checkB(false);
                            });
                            checked = false;
                            return;
                        }
                        if(!checked){
                            $.each(mainData(), function(){
                                this.checkB(true);
                            });
                            checked = true;
                            return;
                        }
                    };

                    viewModelInbox.mainData = ko.dependentObservable(function() {
                    var search = this.query().toLowerCase();
                    return ko.utils.arrayFilter(viewModelInbox, function(test) {
                        return test.name.toLowerCase().indexOf(search) >= 0;
                    });

                }, viewModelInbox);
                    return {
                        mainData: mainData,
                        showView: showView,
                        currentView: currentView,
                        approve: approve,
                        disapprove: disapprove,
                        toggle: toggle
                    };

                },
mainData
observeable数组包含一些值,如name、code、date等

我遇到的问题是,我遇到了以下错误:

TypeError: this.query is not a function 

var search = this.query().toLowerCase();

我很确定我错过了一些非常小的东西,但因为我在knockoutjs中是个十足的noob,所以我无法发现它。

它似乎不是什么小东西

您的视图模型应该是

var ViewModel = function() {
    this.query = ko.observable(''); // use ';'
    this.mainData = ko.observableArray([]);
};


你不能把它们混在一起。

或者你可以这样写:

var ViewModelInbox = function() {
    var self = this;

    self.query = ko.observable('');

    self.dataSource = []; // data source

    self.mainData = ko.computed(function() {
        var search = self.query().toLowerCase();
        return ko.utils.arrayFilter(self.dataSource, function(item) {
            return item.name.toLowerCase().indexOf(search) >= 0;
        });
    });

    self.showView = ko.observable();
    self.currentView = ko.observable();

    self.approve = function() {

    };

    self.disapprove = function() {

    };

    self.checked = ko.observable(true);

    self.toggle = function() {
        var toCheck = !self.checked();
        ko.arrayForEach(self.mainData(), function(data) {
            data.checkB(toCheck);
        });
        self.checked(toCheck);
    };
};

ko.applyBindings(new ViewModelInbox());

我使用的是第二种结构,但逗号(,)似乎不起作用。它要求的是(;)而不是它如果使用第二种结构,则应删除“function”,并使用“:”而不是“=”
var ViewModelInbox = function() {
    var self = this;

    self.query = ko.observable('');

    self.dataSource = []; // data source

    self.mainData = ko.computed(function() {
        var search = self.query().toLowerCase();
        return ko.utils.arrayFilter(self.dataSource, function(item) {
            return item.name.toLowerCase().indexOf(search) >= 0;
        });
    });

    self.showView = ko.observable();
    self.currentView = ko.observable();

    self.approve = function() {

    };

    self.disapprove = function() {

    };

    self.checked = ko.observable(true);

    self.toggle = function() {
        var toCheck = !self.checked();
        ko.arrayForEach(self.mainData(), function(data) {
            data.checkB(toCheck);
        });
        self.checked(toCheck);
    };
};

ko.applyBindings(new ViewModelInbox());