4

javascriptとknockout.jsに入ったところです。私が達成しようとしていることの例をたくさん見つけました。そして、見落としているかもしれない小さな構文エラーがあるように感じます。サーバーから ajax/json 経由で既に返されたセット ( this.tasks )をフィルター処理しようとしています。私はそれがうまく機能しています。私がやりたいことは、ユーザーが完了したタスクと未完了のタスクを切り替えることができるようにすることです。

tasksFiltered で foreach ループを実行するようにコードを切り替えました。「this.done」は true または false のいずれかです。

タスク テンプレート

var taskModel = function(id, title, description, done){
    var self = this;
    this.id = ko.observable(id);
    this.title = ko.observable(title);
    this.description = ko.observable(description);
    this.done = ko.observable(done);

    this.showEdit = ko.observable(false);
    this.titleUpdate = ko.observable(false);
    this.descriptionUpdate = ko.observable(false);
};

ページモデル

var pageModelTasks = function(){
    var self = this;
    this.task_title = ko.observable("");
    this.task_description = ko.observable("");
        this.task_title_focus = ko.observable(true);
    this.tasks = ko.observableArray([]);

    this.tasksFiltered = ko.computed(function() {
        return ko.utils.arrayFilter(this.tasks, function(Task) {
        return Task.done == true;
      });
    });

   // CRUD functions excluded 
}; 

これは機能しません。

4

3 に答える 3

10

コードに 2 つの小さな修正を加えます。まず、@XGreen が述べたように、関数の最初のパラメーターとして、observableArray インスタンスではなく、配列値を渡す必要がありarrayFilterます。最後に、Task.doneは監視可能であるため、メンバーを呼び出して値を取得する必要があります。変更されたコードは次のとおりです。

this.tasksFiltered = ko.computed(function() {
    return ko.utils.arrayFilter(this.tasks(), function(Task) {
        return Task.done() === true;
    });
});
于 2013-11-13T06:06:27.860 に答える
1

2 番目の解決策には、ko.utils.stringStartsWith メソッドに問題があります。

ko.utils.stringStartsWith がリリース ファイルにありません。

次のコードを使用できます。

  var stringStartsWith = function (string, startsWith) {          
        string = string || "";
        if (startsWith.length > string.length)
            return false;
        return string.substring(0, startsWith.length) === startsWith;
    };

課題リンクを参照

于 2014-07-14T05:20:22.400 に答える