hướng dẫn Folliwing đưa ra trong documentation, tôi có mô hình quan điểm sau đây:vòng lặp vô hạn khi chuyển đổi đối tượng loại trực tiếp đến đối tượng JavaScript đơn giản
var newContactViewModel = function() {
var self = this;
self.Name = ko.observable();
self.Address = ko.observable();
self.City = ko.observable();
self.State = ko.observable();
self.PostalCode = ko.observable();
self.Save = function() {
$.ajax({
type: "POST",
url: "/contact",
data: ko.toJS(self), //infinite loop here
success: state.OnSaved
});
};
};
Khi phương pháp self.Save
được gọi, một vòng lặp vô hạn xảy ra. Chrome thực sự báo cáo các lỗi như:
Uncaught RangeError: Maximum call stack size exceeded
Nếu tôi sử dụng ko.mapping.toJS(self)
thay vì ko.toJS(self)
, sau đó tôi nhận được một lỗi hơi hở hang hơn, nhưng không có lỗi thật "message":
Nếu tôi hoán đổi ko.toJS(self)
với một cái gì đó như { Name: self.Name(), Address: self.Address() /* etc */ }
, sau đó mọi thứ hoạt động tốt. Có vẻ như nó đang cố gắng chuyển đổi phương thức Save
và gọi lại phương thức đó.
Có lỗi trong KnockoutJS hoặc có sự cố khi tôi sử dụng nó. Tôi thích cái sau. Suy nghĩ?
Đó là thông tin thực sự hữu ích, bởi vì tôi đã gặp rắc rối với mô hình Backbone nơi tôi đang bổ sung thêm rất nhiều tài liệu tham khảo bộ sưu tập cha mẹ vv Tuy nhiên, đây chỉ là một giải pháp thực tế, tôi nghĩ rằng, nếu bạn đang tự làm chuyển đổi. Nó không giúp ích nếu ko.toJS được sử dụng trong nội bộ trong mã thư viện khác. – neverfox
giải pháp tốt cho một quyết định thiết kế hoàn toàn tai hại. những gì khá thẳng thắn làm cho tôi tức giận ngay bây giờ là tôi đã không nhận ra hành vi này trong nhiều tháng và về cơ bản nó còn lại là 'theo thiết kế' https://github.com/knockout/knockout/pull/1079 - điều này cần phải được cấu hình –