9

Đây là những ngày đầu tiên tôi làm việc trên BackBone.js. Tôi thực sự bị mắc kẹt với một phần router như tôi đang nhận được một lỗi trong giao diện điều khiển "Lỗi: một tài sản url hoặc chức năng phải được chỉ định". Đây là kịch bản của tôi; Tôi có một chức năng bấm mà tự động tạo một URL REST, và lấy dữ liệu từ máy chủ cho phù hợp.Lỗi: thuộc tính url hoặc chức năng phải được chỉ định

Dưới đây là chức năng nhấp chuột đang

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

Và tôi có đoạn mã sau vào router

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

Ai đó có thể giúp tôi để tìm ra vấn đề ở đây? Tôi biết tôi đã làm điều gì đó sai ở đây và tìm kiếm một lời khuyên của chuyên gia về điều này. Một mẫu woking cho kịch bản này được nhiều đánh giá cao.

+0

Bạn có thể đưa ra một số bối cảnh cho lỗi của mình không? Bạn đã cố gắng làm gì để giải quyết vấn đề này? – tkone

Trả lời

21

Bạn đang gọi điện thoại fetch trên mô hình của bạn:

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

Nhưng bạn đã không đưa ra mô hình của bạn một tài sản url:

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

Các fetch phương pháp đàm phán đến máy chủ và nó sử dụng url để làm như vậy:

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.

Các default implementation for a Model's url trông như thế này:

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

Bạn không có urlRoot, bạn không có một bộ sưu tập để ủy thế hệ URL để, và bạn chưa ghi đè url nên urlError() được gọi và đó là nơi thông báo lỗi của bạn xuất phát từ đó.

UserModel cần có một thuộc tính hoặc chức năng RESTful url để bạn có thể fetch trường hợp từ máy chủ. Ngoài ra, bạn có thể tạo các mô hình của mình từ dữ liệu đã có sẵn trong môi trường phía máy khách của bạn (miễn là bạn không có kế hoạch tiết kiệm bất cứ thứ gì thông qua Backbone).

+0

Cảm ơn câu trả lời của bạn, nó rất hữu ích. –