【问题标题】:BackboneJS Uncaught Error: A "url" property or function must be specifiedBackboneJS 未捕获错误:必须指定“url”属性或函数
【发布时间】:2014-12-11 20:55:26
【问题描述】:

我收到此错误。我可以使用 BackboneJs 执行读取和删除功能,但是当我执行 add 方法时出现错误,将不胜感激。 JSfiddel 路径为http://jsfiddle.net/2wjdcgky/

BackboneJS Uncaught Error: A "url" property or function must be specified 

$(function() {

型号

var modelContact = Backbone.Model.extend({
    defaults: function() {
        return {
            Id: 0,
            Name: "",
            Address: ""
        };
    },
    idAttribute: "Id"
});

模型集合

var contactCollection = Backbone.Collection.extend({
    model: modelContact,
    url: function() {
        return 'api/Contact';
    },
    add: function(model) {
        this.sync("create", model); // Error On create
    },
    remove: function(model) {
        this.sync("delete", model); //Runs Fine
    }
});
var contacts = new contactCollection;

查看

var contactView = Backbone.View.extend({
    tagName: "tr",
    events: {
        "click a.destroy": "clear"
    },
    template: _.template($("#newContacttemplate").html()),
    initialize: function() {
        this.model.on("change", this.render, this);
        this.model.on('destroy', this.remove, this);
    },
    render: function() {
        this.$el.html(this.template(this.model.toJSON()));
        return this;
    },
    clear: function(e) {
        contacts.remove(this.model); // runs fine
    }
});

主视图

var main = Backbone.View.extend({
    el: $("#contactApp"), 
    events: {
        "click #btnsave": "CreateNewContact"
    },
    initialize: function() {
        this.Nameinput = this.$("#contactname");
        this.Addressinput = this.$("#contactaddress");

        contacts.on("add", this.AddContact, this);
        contacts.on("reset", this.AddContacts, this);
        contacts.fetch();
    },
    AddContact: function (contact) {
        console.log("AddContact");
        var view = new contactView({ model: contact });
        this.$("#tblcontact tbody").append(view.render().el);
    },
    AddContacts: function () {
        console.log("AddContacts");
        contacts.each(this.AddContact);
    },
    CreateNewContact: function (e) {
        console.log(e);
        //Generate an error "BackboneJS Uncaught Error: A "url" property or function must be specified"
        contacts.add({ Name: this.Nameinput.val(), Address: this.Addressinput.val() });
    }
});
var m = new main;

});

【问题讨论】:

  • 您正在使用“add”、“remove”等覆盖标准 Backbone.Collections 方法,这可能会导致意外行为。最好为该函数名称赋予一些含义,或直接使用标准名称。如果您想保存联系人并将其添加到集合中,请调用 model.save() 并将其添加到您的 success 处理程序中的集合中...
  • 注意点但是我的删除方法工作正常,我也覆盖了它。

标签: javascript jquery backbone.js asp.net-web-api


【解决方案1】:

您的 JSFiddle 缺少 Backbone 引用和所有内容。

工作更新:http://jsfiddle.net/apt7hchL/2/

更简单的代码(无需在集合上定义那些add 和remove 方法!)。还有更常见的 Javascript 编码风格约定。

请注意,我必须手动生成一个“Id”属性以允许创建多个联系人。由于您默认设置 Id = 0,因此不会添加第二个具有相同的模型,因为 Backbone 看到 id=0 的模型已经在集合中。

当你想保存时,调用model.save() 方法。不要手动调用sync,你通常不需要!

对于要在添加到集合之前保存到数据库的模型,请使用:

createNewContact: function (e) {
  e.preventDefault();
  var self = this;
  var newContact = new ContactModel({                   
    Name: this.$("#name").val(),
    Address: this.$("#address").val()
  });
  newContact.save({ success: function(model){
    self.collection.add(model);
  });

  //clear form
  this.$("#name").val("");
  this.$("#address").val("");

}

【讨论】:

    【解决方案2】:

    Sync 方法尝试使用 CRUD 功能同步到服务器设置来处理它。如果这不是您要查找的内容,而您只想在客户端显示此信息,而不是使用同步,则应使用 Collection.add(model) 和 Collection.remove(model)

    【讨论】:

    • 并且您的删除正在工作,因为您没有在那里访问您覆盖的删除方法,它超出了范围,您引用了我刚才提到您应该使用的常规删除。同样,同步方法仅用于与 RESTful 服务器交互,如果该服务器未正确处理请求,它将引发 url 错误。
    • 我有一个服务器设置 asp.net webapi。它被称为罚款并响应 Post /Delete/PUT 请求。我应该如何调用覆盖的删除或任何替代方法
    • 实际上,抱歉,您的 remove 可能被正确调用,我刚刚打开您的 JSFiddle 并注意到您将所有 Javascript 代码放在一起。如果要将集合和视图分离到两个单独的文件中,则需要一个全局命名空间。那么哪个不起作用,添加或删除,因为在您的描述中您说删除不起作用,但是在代码中的 cmets 中说添加不起作用。是哪一行代码导致了错误?
    • 已更新。关于文件分离。我可以做到这一点,但由于我是backbonejs的新手,因此专注于当前代码会很好/节省时间。不过谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多