1

バックボーンを REST API で使用しようとしています:

ここにコード

私のモデル:

var PagesModel = Backbone.Model.extend({
    idAttribute: 'Guid',
    initialize: function () {
        this.on('remove', this.destroy);
    },
    urlRoot: '/api/pages'
});

コレクション:

var PagesCollection = Backbone.Collection.extend({
        model: PagesModel,
        url: '/api/pages'
    });

意見:

var PagesView = Backbone.View.extend({
    el: '#pages',
    events: {
        'click .removePage': 'remove',
    },
    initialize: function (collection) {
        this.collection = collection;
        this.collection.fetch();
        this.template = $('#pages-template').html();
        this.collection.bind('change reset', this.render, this);

    },
    render: function () {
        var template = _.template(this.template);
        $(this.el).html(template({ pages: this.collection.toJSON() }));
        return this;
    },
    remove: function (e) {
        e.preventDefault();
        var id = $(e.currentTarget).closest('ul').data("id");
        var item = this.collection.get(id);
        this.collection.remove(item);
        $(e.currentTarget).closest('ul').fadeOut(300, function () {
            $(this).remove();
        });
    }
});

そして、ここで私はアプリケーションを起動しています:

$(function () {
    var pagesCollection = new PagesCollection();
    var pagesView = new PagesView(pagesCollection);
});

または [削除] をクリックすると、ネットワーク インスペクタでこのリンクが表示されます

http://localhost:54286/backbone/function%20()%20%7B%20%20%20%20%20%20var%20base%20=%20getValue(this,%20'urlRoot')%20%7C%7C%20getValue(this.collection,%20'url')%20%7C%7C%20urlError();%20%20%20%20%20%20if%20(this.isNew())%20return%20base;%20%20%20%20%20%20return%20base%20+%20(base.charAt(base.length%20-%201)%20==%20'/'%20?%20''%20:%20'/')%20+%20encodeURIComponent(this.id);%20%20%20%20}

/api/pages/{guid} の代わりに。

私が間違っていることは何ですか?

4

2 に答える 2

1

理由はまだ完全にはわかりませんが、削除の終了にモデルを破棄することで機能させることができます(Backbone はイベントをトリガーした後に最後のことを行いremoveます: モデル内のコレクションの参照を破棄します)。

しかし、さらに優れているのは、モデルで関数を直接使用することです。destroyコレクションから自動的に削除されます ({wait: true}必要に応じて使用します)。

編集:
最終的に問題の原因を突き止めることができました。実際にはかなり単純です。urlモデル(で計算されますurlRootが、それは問題ではありません)をオーバーライドするには、呼び出し時Model#destroyurlオプションBackbone.sync(またはそれを呼び出すもの) を渡すことができます。
今、あなたは「でも私はしない!」と考えています。しかし、あなたは行います。リスナー(Model#destroyあなたの場合)には3つの引数が与えられます。Model#destroyは最初のもの (モデル自体) を として受け取りoptionsます。
そして、これが失敗です(バックボーンにはこれに対するパッチが必要だと思います):urlオプションを与えることは、URLの計算に使用されないBackbone.sync唯一の時間です。_.resultしたがって、モデルの url プロパティを url として持っていることがわかります。これは、呼び出しで表示される関数です。

さて、クイックフィックスのために:

this.on('remove', this.destroy.bind(this, {}));

Model#destroyこれにより、呼び出しの最初の引数が確実になります{}(コンテキストをバインドするだけでなく)。

もう少し我慢してください。

Collection#remove さて、モデルを破棄する前にまだ呼び出したい場合は、ちょっとしたハックがあります: (上で述べたように) Backbone がモデル内のコレクションの参照を確実に削除する前にremoveイベントがトリガーされるため、モデルのプロパティ。実際、モデルはコレクションに含まれなくなりますが、Backbone はコレクションの URL を考慮してモデルの URL を取得します (参照がまだ存在するため)。urlRoot

于 2013-06-06T13:39:40.843 に答える
0

決定的な答えではありませんが、質問のコードとbackbone.jsのドキュメントを見ると、メソッドに名前を付けていて、これがメソッドremoveの邪魔になっている可能性があります。removeBackbone.View

http://backbonejs.org/#View-remove

更新

また、ネットワーク インスペクタに表示される出力は、Backbone.Model.url関数の定義が追加されているように見えます。url適切に呼び出されていないことを意味します (()呼び出し元が を見逃している可能性がありますか?)。Backbone.syncアプリケーションのどこかをオーバーライドしていますか?

于 2013-06-06T12:30:32.717 に答える