Làm cách nào để kích hoạt lệnh gọi lại thành công trên model.save ()?


106
this.model.save({
  success: function(model, response){
    console.log('success');
  },
  error: function(){
    console.log('error');
  }
})

Mô hình được đăng chính xác lên máy chủ xử lý lưu, nhưng lệnh gọi lại thành công không được kích hoạt. Tôi có cần gửi lại thứ gì đó từ máy chủ không?


7
Hóa ra tôi đã làm sai: cú pháp đúng phải là: this.model.save (newItem, {thành công: ..., lỗi: ...})
Running Turtle

8
'null' dường như cũng hoạt động tốt như một trình giữ chỗ.
UpTheCreek

@UpTheCreek Cảm ơn. Điều đó đã giúp. Tôi đã xem xét nguồn và chuyển một chuỗi trống làm khóa và giá trị. Thích phương pháp của bạn hơn.
Pramod

Rỗng @UpTheCreek không làm việc cho tôi vì một lý do nhưng đi qua một attr trống obj đã làm :)
KoalaKid

Câu trả lời:


123

Đối số đầu tiên của lưu là các thuộc tính để lưu trên mô hình:

this.model.save( {att1 : "value"}, {success :handler1, error: handler2});

9
Tôi hơi bối rối - (1) Tôi nghĩ rằng đường trục luôn gửi lại toàn bộ mô hình trong quá trình lưu (không thể gửi cập nhật từng phần mô hình). Vậy mục đích của giá trị tên thuộc tính là gì? (2) Điều gì sẽ xảy ra nếu bạn chỉ muốn lưu mô hình sau khi thực hiện một số .set () - tại sao lại là danh sách thuộc tính? (3) Trong tài liệu, tham số danh sách thuộc tính được hiển thị dưới dạng tùy chọn. Bạn có thể làm rõ? Cảm ơn.
UpTheCreek

7
Bạn có thể thực hiện một loạt "tập hợp" với các thuộc tính của mình và sau đó thực hiện lưu mà không có bất kỳ thuộc tính nào. Tất cả các thuộc tính của mô hình luôn được gửi đến máy chủ. Lưu với các thuộc tính chỉ là một phím tắt để đặt + lưu.
Julien

5
Ngớ ngẩn như có vẻ như đây chính xác là những gì nó làm, thật xấu hổ vì nó được ghi chép kém.
Kevin

51
Trong thử nghiệm của tôi, có vẻ như các lệnh gọi lại thành công và lỗi không được kích hoạt nếu bạn không chuyển một cái gì đó cho tham số "thuộc tính". Điều này có vẻ mâu thuẫn với tài liệu ... model.save ([thuộc tính], [tùy chọn]) sẽ chỉ ra rằng các thuộc tính là tùy chọn. Khi tôi bao gồm các thuộc tính hoặc null cho các thuộc tính, các lệnh gọi lại thành công và lỗi của tôi sẽ được kích hoạt. Khi tôi không bao gồm bất kỳ thứ gì cho các thuộc tính, các lệnh gọi lại KHÔNG được kích hoạt.
Kevin

6
đã kiểm tra mã nguồn của backbone.js [ backbonejs.org/docs/backbone.html ]. dường như attr là bắt buộc .. nếu chỉ 'tùy chọn' được cung cấp các chức năng giả định nó là 'attr' và messes lên các cuộc gọi
Kumaresan

58

Vì một số lý do không xác định , không có phương pháp nào ở trên hiệu quả với tôi. Chỉ api không bị đánh trong trường hợp của tôi.

Nhưng sau đó trong khi tìm kiếm về điều này, tôi tình cờ gặp liên kết này , nơi một số người đã thử nullthay vì {}làm tham số đầu tiên.

this.model.save(null, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

vì vậy, điều này đã làm việc cho tôi. Hy vọng điều này cũng giúp bạn.


3
Đây là câu trả lời chính xác. Nếu bạn nhập null Backbone sẽ gửi tất cả các thuộc tính đến máy chủ để lưu.
Paul Oliver,

Kỳ lạ nhưng phương pháp đã chọn của tôi.
Matt Fletcher

37

Máy chủ của bạn phải trả về một đối tượng JSON. Nếu phản hồi không phải là một đối tượng JSON, thì các lệnh gọi lại sẽ không kích hoạt.

Nếu thành công máy chủ của bạn không trả về đối tượng JSON, hãy thực hiện lưu với tùy chọn dataType: "text" , như sau:

this.model.save([],{
 dataType:"text",
 success:function() {},
 error:function() {}
});

Với tùy chọn này, nó sẽ không đợi JSON phản hồi mà là một văn bản và do đó lệnh gọi lại sẽ được khởi chạy.


Cảm ơn bạn. Điều này đã khiến tôi thích thú. Sẽ là tuyệt vời nếu điều này đã được ghi nhận trong các tài liệu Backbone ở đâu đó,
Tobias J

điều này đã cứu cái mông của tôi. Tôi đang sử dụng res.json ({success: result}) với Express 4 và điều đó vẫn khiến tôi gặp sự cố. Có lẽ tôi cần phải làm: res.json ({ "thành công": "Kết quả"}) hoặc một cái gì đó ...
Alexander Mills

Cảm ơn rất nhiều! Điều này đã làm nên ngày của tôi.
alcfeoh

11

Bạn có thể sử dụng lib gạch dưới như sau vì xương sống đã phụ thuộc vào điều này. Hãy nhớ đối số đầu tiên của lưu phải có thuộc tính hoặc bạn có thể chỉ cần chuyển {} trong trường hợp bạn muốn lưu chính mô hình.

this.model.save({}, _.bind(function(model, response){
  //Do whatever you want e.g.
  this.collection.add(model)
}, this))

8

vì vậy tôi hơi bối rối - tôi có cần phải chuyển tất cả các thuộc tính để gọi một sự kiện lưu không? điều gì sẽ xảy ra nếu mô hình của tôi lớn .. tôi không muốn đặt mọi thuộc tính theo cách thủ công

tôi đang gọi model.save và cố gắng làm như sau:

this.model.save(
    {
        success: function (model, response) {
            console.log('model saved');
        }
    });

Được rồi, chỉ cần trả lời câu hỏi của riêng tôi trong trường hợp bất kỳ ai tìm thấy bài đăng này, tôi đã làm như sau mà hoạt động:

this.model.save({ id: this.model.get('id') },
    {
        success: function (model, response) {
            console.log("success");
        },
        error: function (model, response) {
            console.log("error");
        }
    });

CHỈNH SỬA: Tôi không thể trả lời bạn vì một số lý do, nhưng tôi có thể chỉnh sửa

nhưng bạn không phải đặt id: this.model.get('id')bạn chỉ có thể chuyển một đối tượng trống bởi vì một thuộc tính trống sẽ không mở rộng các thuộc tính, không làm gì cả:

this.model.save({}, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

4

Sau đây là mã mà tôi đang sử dụng để lưu mô hình xương sống.

this.model.save(model,{
   success:function(model){
       console.log("Saved Successfully");
   },
   error:function(model){
       console.log("Error");
   }
});

Chúc mừng

Roy MJ


hơi mất tập trung khi chuyển một cục bộ modelđến một this.model.. modelnên được attributes, được đặt và lưu cùng với mọi thứ trongthis.model
Funkodebat

@Funkodebat: Vâng. :) .. Tôi thực sự nghĩ điều này tương tự như jquery-ajax bình thường, nhưng trong Backbone, tham số đầu tiên sẽ là mô hình. Không nhất thiết phải vượt qua nó, mà là nhận được một cái tương ứng. Thực sự là khá đáng lo ngại .. :(
Roy MJ

Vâng, sự thật là không, bạn không vượt qua mô hình khi gọi lưu. đối số đầu tiên của lưu là các thuộc tính bổ sung mà bạn có thể đặt trước khi gọi lưu. Nó giống như gọi điện model.set(model.toJSON()); model.save(). không có lý do gì để thiết lập một mô hình thành những gì mà mô hình được đặt thành .. đó là hình mẫu thừa để chuyển một mô hình cho chính nó khi lưu.
Funkodebat

2
@Funkodebat Tôi đã từ chối những thay đổi của bạn đối với câu trả lời 3 tuổi này vì chúng đã thay đổi hoàn toàn câu trả lời của tác giả. Đây không phải là mục đích của hệ thống chỉnh sửa / kiểm duyệt. Nếu câu trả lời không còn phù hợp hoặc thích hợp, hãy bỏ phiếu và viết câu trả lời mới. Các công cụ kiểm duyệt là để sửa ngữ pháp, định dạng, chính tả và viết hoa - không phải để điều chỉnh câu trả lời của những người dùng khác.
reach4thelasers

2
Cộng đồng sẽ không đồng ý với bạn. Đó là một câu hỏi được bình chọn cao với câu trả lời hàng đầu được bình chọn cao. Câu hỏi có vẻ liên quan đến cộng đồng. Nếu bạn không đồng ý với bất kỳ điều gì, hãy sử dụng nút bỏ phiếu. Đây không phải là nơi bạn quyết định những câu hỏi và câu trả lời nào có quyền trên trang web này và chắc chắn không phải là nơi bạn sửa đổi câu trả lời của những người dùng khác đến mức ý nghĩa của chúng bị thay đổi mạnh mẽ.
reach4thelasers

1

Đối với những người muốn lưu một mô hình mà không cần cập nhật các thuộc tính, bạn có thể thực hiện như sau:

model.once("sync", function(model, response, options){
    //
});
model.once("error", function(model, response, options){
    //
});
model.save();

1

Trong hàm khởi tạo của bạn, hãy liên kết phương thức đồng bộ hóa với một phương thức bạn xác định (onSaveSuccess)

            initialize: function (options) {
                    this.model.on('sync', _.bind(this.onSaveSuccess, this));
},
            onSaveSuccess: function() {
                console.log('saved');
                this.render();
            },

Bằng cách này, bất cứ khi nào bạn chạy this.model.save (), nó sẽ chạy hàm onSaveSuccess dưới dạng một lệnh gọi lại nếu đồng bộ hóa của bạn thành công

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.