2014-10-16 73 views
2

我收到此错误。我能够使用BackboneJs进行预形成读取和删除功能,但是当我执行add方法时,出现错误,任何帮助将不胜感激。 JSfiddel路径是http://jsfiddle.net/2wjdcgky/BackboneJS未捕获错误:必须指定“url”属性或函数

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" 
}); 

ModelCollection

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; 

});

+0

你重写标准Backbone.Collections方法与“添加”,“删除”等等,这可能会导致意外的行为。最好给那个函数名称一些意思,或者直接使用标准函数名称。如果你想保存一个联系人并将其添加到集合中,请调用model.save()并将其添加到你的''成功'处理程序中的集合... – CharlieBrown 2014-10-16 13:14:30

+0

注意点但我的删除方法工作正常,我已经覆盖它也。 – 2014-10-16 13:19:03

回答

0

同步方法尝试同步到服务器设置来处理它,并具有CRUD功能。如果那不是你正在寻找的东西,而你只是想在客户端显示这些信息,而不是使用同步,则应该使用Collection.add(model)和Collection.remove(model)

+0

而你的删除工作,因为你没有访问你的覆盖删除方法那里,超出范围,你引用我刚才提到你应该使用的定期删除。同样,同步方法仅用于与RESTful服务器进行交互,如果服务器未正确处理请求,它将抛出url错误。 – frajk 2014-10-16 13:21:34

+0

我有一个服务器设置asp.net webapi。它被称为罚款并回应Post/Delete/PUT请求。我应该如何调用覆盖删除或任何替代 – 2014-10-16 13:25:54

+0

其实,对不起,您的删除可能被调用正确,我刚刚打开你的JSFiddle,并指出你有所有的Javascript代码在一起。如果要将收集和查看分离为两个独立的文件,则需要全局名称空间。所以哪一个不起作用,添加或删除,因为在你的描述中你说删除不起作用,但是在代码中的注释中说明了添加不起作用。哪行代码导致错误? – frajk 2014-10-16 13:36:56

3

您的JSFiddle缺少骨干引用和所有。

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

很多简单的代码(无需定义在收集这些addremove方法!)。还有更常见的Javascript编码风格约定。

请注意我必须手动生成“Id”属性才能创建多个联系人。由于默认情况下使Id = 0,所以不添加第二个模型,因为Backbone发现id = 0的模型已经在集合中。

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

为使模型能够被添加到集合之前被保存到数据库中,使用方法:

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(""); 

}

相关问题