9

コレクションフェッチでモデルの解析機能を防ぐ方法は?

    $(function() {
    var Task = Backbone.Model.extend({
        url : function() {
                return this.urlRoot + this.id;
        },
        urlRoot: 'index.php?c=light&a=list_tasks_bb&ajax=true&task=',
        parse: function (response, options) {
            console.log(options);
            console.log(response);
            return response;
        }
    });

    var TaskList = Backbone.Collection.extend({
        model: Task,
        url: 'index.php?c=light&a=list_tasks_bb&ajax=true',

        initialize: function () {

        },
        parse: function (response, options) {
            return response.tasks;
        }
    });

    var Light = Backbone.Router.extend({
        el: $('#light'),
        routes: {
            "tasks/:id": "taskAction",
            "*page": "defaultAction",
        },

        initialize: function () {
            _this = this;
            this.tasks = new TaskList();
            this.users = new UserList();
        },

        taskAction: function(id) {
            this.task = new Task({id: id});
            $.when (
                this.task.fetch()
            ).then(function(zzz) {
                new TaskView({model: _this.task}).render();
            });
        },
        defaultAction: function(page) {
            $.when (
                this.tasks.fetch(),
                this.users.fetch()
            ).then (function() {
                new TaskListView({collection: _this.tasks}).render();
            });
        }
    });
});

ajax fetch で取得した 1 つのモデルと 1 つのコレクションがあります。バックエンドを変更する機会がないため、タスク リストの json 構造は次のとおりです。

"contents": {},
"current": false,
"errorCode": 0,
"errorMessage": "",
"u": 4,
"tasks": [{
    "id": "12250",
    "t": "ZZZ",
    "cid": "24",
    "c": "2013-08-22 11:36:32",
    "dd": "02.09.2013",
    "sd": "02.09.2013",
    "pr": "300",
    "pid": "0",
    "atid": "1:4",
    "s": 0,
    "dl": ""
}, {
    "id": "12307",
    "t": "ZZZ",
    "cid": "42",
    "c": "2013-08-28 11:14:44",
    "dd": "05.09.2013",
    "sd": "28.08.2013",
    "pr": "200",
    "pid": "0",
    "atid": "1:4",
    "s": 0,
    "dl": ""
}, {
    "id": "12326",
    "t": "ZZZ",
    "cid": "2",
    "c": "2013-08-29 09:55:34",
    "dd": "31.08.2013",
    "sd": "29.08.2013",
    "pr": "200",
    "pid": "0",
    "atid": "1:4",
    "s": 0,
    "dl": ""
}],
"events": []

これが、コレクションに解析を使用している理由です。このステップでは、すべて問題ありません。単一タスクの JSON 構造は次のとおりです。

"contents": {},
"current": false,
"errorCode": 0,
"errorMessage": "",
"u": 4,
"tasks": [{
    "id": "12250",
    "t": "ZZZZ",
    "cid": "24",
    "c": "2013-08-22 11:36:32",
    "dd": "02.09.2013",
    "sd": "02.09.2013",
    "pr": "300",
    "pid": "0",
    "atid": "1:4",
    "text": "XXXXX",
    "s": 0,
    "dl": ""
}],
"comments": [{
    "id": "48178",
    "text": "CCCC",
    "cid": "4",
    "con": "23.08.2013"
}],
"events": []

したがって、「task.fetch()」の後に単一のタスクをフェッチするために再度解析する必要があります。モデルに解析関数を追加した後、コレクションの取得を開始するまで正常に動作しました。これは、コレクションの解析後に正しいモデル データが既にあるためですが、各モデルのモデル解析コールバックが再び発生するためです。

これを修正する正しい方法はありますか、それともバックエンドを変更してみますか?

PS確かに、私はこのようなことができます:

  if(response.tasks) {
    return response.tasks[0];
  } else {
    return response;
  }

しかし、それは正しい解決策ではないと思います。

4

1 に答える 1

23

コレクションに挿入するモデルを作成する場合、Backbone は、将来のコレクションをオプションとしてモデル コンストラクターに渡します。モデル コンストラクターは、このオプションを に転送しますparse。このプロパティを確認して、必要に応じて解析を中止できます。

var Task  = Backbone.Model.extend({
    parse : function(response, options){
        if (options.collection) return response;
        return response.tasks[0];
    }
});
var TaskList = Backbone.Collection.extend({
    model: Task,
    parse : function(response){
        return response.tasks;
    }
});

そしてデモhttp://jsfiddle.net/nikoshr/dfMgR/

于 2013-09-06T09:20:00.600 に答える