0

コードにクレイジーな問題があります。このjsfiddleコードを実装しようとしています

私のコードでは、しかし私は成功していません。これが私がやったことです:

ビューモデル:

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可能な配列には、名前、コード、日付などの値が保持されています。

私が抱えている問題は、次のエラーが発生することです。

TypeError: this.query is not a function 

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

私は本当に小さなものを見逃していると確信していますが、私はノックアウトjsの初心者なので、それを見つけることはできません.

4

2 に答える 2

1

それは小さなことではないようです。

ビューモデルは次のいずれかである必要があります

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

また

var viewModel = {
    query: ko.observable(''),  // use ','
    mainData: ko.observableArray([])
};

それらを混在させることはできません。

于 2013-06-05T06:48:25.807 に答える
1

または、次のように書くこともできます。

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());
于 2013-06-05T06:57:16.347 に答える