Backbone不会在请求之前评估url函数

时间:2013-06-06 11:07:19

标签: ajax rest backbone.js

我正在尝试使用Backbone和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}。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我仍然没有完全理解为什么,但是你可以通过在>删除之后摧毁你的模型来使其工作(Backbone在触发remove事件后做了最后一件事:在模型中销毁集合的引用。)

但更好的是,直接在模型上使用destroy函数,它会自动将其从集合中删除(如果需要,使用{wait: true})。

修改
最后设法找到问题的根源。事实上它很简单。要覆盖模型的url(使用urlRoot计算但无关紧要),您可以在调用Model#destroy时传递url Backbone.sync选项(或其他内容)那就是它。) 现在你在想“但我没有!”。但你做了。监听器(在您的情况下为Model#destroy)给出3个参数。 Model#destroy会将第一个(模型本身)视为options 这就是失败(我认为Backbone需要一个补丁):给url Backbone.sync选项是_.result唯一不用于计算网址的时间this.on('remove', this.destroy.bind(this, {})); 。因此,您会发现自己拥有模型的url属性,这是您在通话中看到的功能。

现在,对于quickfix:

Model#destroy

这将确保{}来电的第一个参数为Collection#remove(以及绑定上下文)。

忍受我一点时间。

现在,如果您仍然愿意在破坏模型之前致电remove ,那么这里有点破解:因为(如上所述)urlRoot事件是触发之前 Backbone确保在模型中删除集合的引用,您不需要模型中的{{1}}属性。实际上,该模型将不再出现在该集合中,但Backbone仍会将该集合的URL考虑在内以获取该模型的URL(因为该引用仍在那里)。

答案 1 :(得分:0)

不是一个明确的答案,只是按照问题和backbone.js documentation中的代码进行操作,问题可能是您将方法命名为remove,这会妨碍remove 1 {} Backbone.View中的方法。

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

<强>更新

您在网络检查器中看到的输出看起来就像是附加了Backbone.Model.url函数的定义。意味着url没有被正确调用(调用者可能缺少()?)。你是否在申请表的任何地方覆盖Backbone.sync