9

这些是我在BackBone.js上工作的第一天。我实际上坚持与路由器部分,因为我在控制台中出现错误“错误:必须指定url属性或函数”。这是我的场景;我有一个点击功能,它动态地形成一个REST URL,并相应地从服务器获取数据。错误:必须指定url属性或函数

这里是点击功能代码

function onUserClick(obj){ 
    var userID=$(obj).attr('id'); 
    window.location.href="#"+userID+"/"; 
    var userRouter = new UserRouter; 
} 

而且我在路由器下面的代码

var userModel; 
var UserRouter = Backbone.Router.extend({ 
    routes:{ 
     ":userid/":"getUsers" 
    }, 
    getUsers:function(userid){ 
     var url="http://myserver.com/users/"+userid; 
     userModel = new UserModel({urlRoot:url}); 
     var userView = new UserView({el:$(#"container")}); 
    } 
}); 
var UserModel = Backbobe.Model.extend({}); 
var UserView = Backbone.View.extend({ 
    model:userModel, 
    initialize:function(){ 
     _.templateSettings = { 
      interpolate: /\{\{\=(.+?)\}\}/g, 
      evaluate: /\{\{(.+?)\}\}/g 
     }; 
     this.model.fetch(); 
     this.model.bind("change",this.render,this); 
    }, 
    render:function(){ 
     var data=this.model.toJSON(); 
     var userTemplate=_.template($("#userTemplate").text()); 
     var htmlData=userTemplate({ 
      "userData":data 
     }); 
     $(this.el).html(htmlData); 
    } 
}); 

有人可以帮助我在这里找出问题?我知道我在这里做错了什么,并寻求专家建议。这个场景的一个令人兴奋的例子非常感谢。

+0

你可以给你的错误一些背景吗?你有什么努力去解决这个问题呢? – tkone 2012-04-09 18:01:27

回答

21

你打电话你的模型fetch

var UserView = Backbone.View.extend({ 
    model: userModel, 
    initialize: function() { 
     // ... 
     this.model.fetch(); 

但是你没有给你的模型url属性:

var UserModel = Backbone.Model.extend({}); 

fetch方法会谈到服务器,它使用url要做到这一点:

urlmodel.url()

Returns the relative URL where the model's resource would be located on the server. If your models are located somewhere else, override this method with the correct logic. Generates URLs of the form: "/[collection.url]/[id]" , falling back to "/[urlRoot]/id" if the model is not part of a collection.

default implementation for a Model's url看起来是这样的:

url: function() { 
    var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError(); 
    if (this.isNew()) return base; 
    return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id); 
}, 

你没有urlRoot,你没有一个集合委托的URL代,并且您还没有覆盖url所以urlError()被调用而这也正是你的错误信息来自于。

您的UserModel需要RESTful url属性或功能,以便您可以从服务器获取fetch实例。或者,您可以使用客户端环境中已有的数据创建模型(只要您不打算通过Backbone保存任何内容)。

+0

感谢您的回答,这很有帮助。 – 2012-04-21 19:22:15

相关问题