2013-06-20 54 views
11

Tôi có một ứng dụng cơ bản bằng cách sử dụng Backbone.js không thực hiện cuộc gọi PUT (mô hình cập nhật). Từ front-end, tôi gọi một mô hình save chức năng không thực hiện cuộc gọi PUT; tuy nhiên, nếu tôi thay thế nó bằng destroy, nó sẽ thực hiện một cuộc gọi DELETE đến back-end. Bất cứ ai có bất kỳ ý tưởng những gì có thể là vấn đề? Hàm không kích hoạt yêu cầu PUT là hàm saveTask.Backbone.js - model.save() không kích hoạt yêu cầu PUT

App.Views.Task = Backbone.View.extend({ 
    template: _.template("<label>ID:</label><input type='text' id='taskId' name='id' value='<%= _id %>' disabled /><br><label>Title:</label><input type='text' id='title' name='title' value='<%= title %>' required/><br><label>Content:</label><input type='text' id='content' name='content' value='<%= content %>'/><br><button class='save'>Save</button>"), 
    events: { 
     "change input":"change", 
     "click .save":"saveTask" 
    }, 
    render: function(eventName){ 
     $(this.el).html(this.template(this.model.toJSON())); 
     //console.log(this.generateTemplate()); 
     return this; 
    }, 
    change: function(event){ 
     var target = event.target; 
     console.log('changing ' + target.id + ' from: ' + target.defaultValue + ' to: ' + target.value); 
     change[target.name] = target.value; 
     this.model.set(change);*/ 
    }, 
    saveTask: function(){ 
     this.model.set({ 
      title:$("#title").val(), 
      content:$("#content").val() 
     }); 
     if(this.model.isNew()){ 
      App.taskList.create(this.model); 
     } else { 
      this.model.save({}); 
     } 
    } 
}); 
+0

Bạn đang sử dụng phiên bản Backbone nào? Tôi đã có một số vấn đề khi cập nhật một mô hình với phiên bản 0.9.9. Nó có thể là một lỗi thầm lặng trong quá trình lưu hoặc một lỗi với phiên bản xương sống của bạn. – mor

Trả lời

18

Nếu kiểu máy của bạn mới, thì tại thời điểm bạn lưu, nó sẽ kích hoạt phương pháp đăng. Nếu mô hình của bạn tuy nhiên không phải là mới và bạn đang cập nhật nó, nó sẽ kích hoạt PUT.

nếu điều này không hoạt động cho bạn, có thể do mô hình của bạn không có thuộc tính id, trong trường hợp bạn đang sử dụng id có tên khác, ví dụ như taskID, thì trong mô hình của bạn, bạn phải đặt idAttribute để taskID để xương sống sử dụng tài sản này như là Id và tất cả mọi thứ sẽ được bình thường.

như thế này:

var Task= Backbone.Model.extend({ 
    idAttribute: "taskId" 
}); 

đây là liên kết đến tài liệu trên Idattibute http://backbonejs.org/#Model-idAttribute

cũng một vấn đề khác có thể là {} trong bạn tiết kiệm gọi thử chỉ

this.model.save(); 

thay vì

this.model.save({}); 
+0

Cảm ơn bạn đã phản hồi. Mô hình của tôi có thuộc tính ID và tôi đã đặt 'idAttribute' - để đảm bảo, tôi đã kiểm tra id của mô hình (' this.model.id') khi tôi cố gắng lưu. Nó vẫn không kích hoạt PUT mặc dù - và 'model.destroy()' hoạt động tốt.Tôi có thiếu gì khác không? –

+0

tại sao bạn có {} bên trong cuộc gọi lưu? tôi nghĩ rằng nó chỉ nên model.save(); không có đối tượng rỗng là tham số. –

+0

Cảm ơn - đó là lỗi đánh máy (trước đây đã cố gắng sử dụng gọi lại thành công), nhưng dường như không liên quan (không có sự khác biệt). Mô hình đang thay đổi chính xác (các thuộc tính được cập nhật), nhưng không lưu vào máy chủ. –

2

tôi tin rằng mô hình được luôn mong tùy chọn tham số và cũng có lẽ là callbacks

this.model.save(null, { 
    success: function (model, response) { 

     // 
    }, 
    error: function() { 
     // 
    } 
}); 

Nếu bạn nhìn vào Backbone src, bạn sẽ thấy rằng quá ...

======

// Set a hash of model attributes, and sync the model to the server. 
// If the server returns an attributes hash that differs, the model's 
// state will be `set` again. 
save: function (key, val, options) { 
    var attrs, method, xhr, attributes = this.attributes; 

    // Handle both `"key", value` and `{key: value}` -style arguments. 
    if (key == null || typeof key === 'object') { 
     attrs = key; 
     options = val; 
    } else { 
     (attrs = {})[key] = val; 
    } 

    options = _.extend({ 
     validate: true 
    }, options); 

    // If we're not waiting and attributes exist, save acts as 
    // `set(attr).save(null, opts)` with validation. Otherwise, check if 
    // the model will be valid when the attributes, if any, are set. 
    if (attrs && !options.wait) { 
     if (!this.set(attrs, options)) return false; 
    } else { 
     if (!this._validate(attrs, options)) return false; 
    } 

    // Set temporary attributes if `{wait: true}`. 
    if (attrs && options.wait) { 
     this.attributes = _.extend({}, attributes, attrs); 
    } 

    // After a successful server-side save, the client is (optionally) 
    // updated with the server-side state. 
    if (options.parse === void 0) options.parse = true; 
    var model = this; 
    var success = options.success; 
    options.success = function (resp) { 
     // Ensure attributes are restored during synchronous saves. 
     model.attributes = attributes; 
     var serverAttrs = model.parse(resp, options); 
     if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 
     if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 
      return false; 
     } 
     if (success) success(model, resp, options); 
     model.trigger('sync', model, resp, options); 
    }; 
    wrapError(this, options); 

    method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); 
    if (method === 'patch') options.attrs = attrs; 
    xhr = this.sync(method, this, options); 

    // Restore attributes. 
    if (attrs && options.wait) this.attributes = attributes; 

    return xhr; 
}, 
2

trong trường hợp của tôi nó không thành công do validations.As tôi lưu các mô hình nó xác nhận tất cả các thuộc tính của mô hình và bộ sưu tập mà tôi đang sử dụng cho giao diện niêm yết không yêu cầu tất cả các một ttributes của mô hình.

Tôi đang đối mặt với cùng một vấn đề và tìm kiếm trong Google và tìm thấy câu hỏi của bạn và đọc giải pháp và nhận xét.Than tôi nhận thấy rằng trong thông số xương sống được cập nhật được đề cập là khi model.save() thực thi trước yêu cầu mô hình, trước tiên cuộc gọi xác thực và nếu xác thực thành công hơn nó sẽ đi trước khôn ngoan khác thất bại, và đó là lý do tại sao nó không hiển thị bất kỳ yêu cầu mạng trong tab mạng trình gỡ lỗi chrome.

Tôi đã viết giải pháp cho trường hợp mà tôi đang gặp phải, có thể là các vấn đề khác.

0

Backbone's sync function là thứ tôi đã sử dụng. Bạn phải truyền vào 'update' làm tham số đầu tiên (tham số 'method').

+0

Thật tuyệt khi biết phiếu bầu là gì. Rất nhiều công trình xây dựng cho tôi và trang web này cũng :) – Stubbs