2012-10-30 25 views
10

Tôi muốn gặp lỗi, sửa lỗi và tiếp tục thực hiện chương trình. http://jsfiddle.net/Gthv9/12/Lỗi bắt KnockoutJS Binding

Nhưng, tôi không thể làm được!

Nếu bạn nhấp vào: "kiểm tra lại trên Model1", "kiểm tra lại trên Model3" - đó là ok.

Nếu bạn nhấp vào: "kiểm tra lại trên Model1", "kiểm tra lại Model2", "kiểm tra lại Model3" - có lỗi.

Uncaught Error: Unable to parse bindings. 
Message: ReferenceError: name3 is not defined; 
Bindings value: text: name3 

Tại sao?

Tôi đã bọc mã sự cố trong một khối try-catch (xemModel.recheckData2()), nhưng, ứng dụng gặp sự cố khi nhấp vào chế độ xemModel.recheckData3()!

Tôi biết rằng knockoutJS lưu trữ trạng thái lỗi (new model2()), nhưng không biết tôi nên làm gì.

Làm cách nào tôi có thể nắm bắt lỗi chính xác?

Cảm ơn!

Trả lời

35

Tôi không chắc chắn rằng tôi hiểu mục tiêu chính xác của bạn, nhưng Knockout sẽ dừng ràng buộc khi nó chạy vào loại sự cố này.

Nếu vấn đề của bạn chỉ là biến không xác định, thì một mẹo mà bạn có thể sử dụng là ràng buộc với $data.name3 thay vì chỉ name3. Việc truy cập một thuộc tính không xác định của một đối tượng hợp lệ không gây ra lỗi.

Nếu bạn thực sự muốn một thứ gì đó mạnh mẽ hơn, thì bạn có thể cân nhắc sử dụng custom binding provider.

Ví dụ, bạn có thể viết một wrapper nhanh chóng để các nhà cung cấp liên kết thực như:

var ErrorHandlingBindingProvider = function() { 
    var original = new ko.bindingProvider(); 

    //determine if an element has any bindings 
    this.nodeHasBindings = original.nodeHasBindings; 

    //return the bindings given a node and the bindingContext 
    this.getBindings = function(node, bindingContext) { 
     var result; 
     try { 
      result = original.getBindings(node, bindingContext); 
     } 
     catch (e) { 
      if (console && console.log) { 
       console.log("Error in binding: " + e.message); 
      } 
     } 

     return result; 
    }; 
}; 

ko.bindingProvider.instance = new ErrorHandlingBindingProvider(); 

này sẽ bắt lỗi, đăng nhập cho họ, và tiến hành. Tất nhiên, phần tử có liên kết "xấu" này sẽ không bị ràng buộc. Nếu có một số cách được biết mà bạn muốn xử lý nó, thì bạn có thể thêm logic đó sau khi bắt lỗi. Có lẽ bạn muốn kiểm tra phần tử đó (node) và bindingContext để xác định những gì cần phải được thực hiện.

mẫu: http://jsfiddle.net/rniemeyer/KxXqs/

UPDATE: Đây là phiên bản dành cho 3.0+ rằng bẫy/nhật ký lỗi trong cú pháp ràng buộc cũng như các lỗi khi giá trị ràng buộc được đánh giá thực tế. http://jsfiddle.net/rniemeyer/ecbn1dmy/

+4

Bạn guru knock-out ! :) – zoh

+0

@RP Niemeyer "Truy cập một thuộc tính không xác định tắt của một đối tượng hợp lệ không gây ra lỗi" - Tôi đã gán một hàm cho thuộc tính tên của một khuôn mẫu ràng buộc. Nếu hàm trả về không xác định, tôi nhận được loại lỗi không thể sửa lỗi mà người hỏi đang nói về việc liệu tôi có sử dụng $ root hoặc $ data hay chỉ tên hàm. Sẽ sử dụng 'tính toán' giúp trong trường hợp đó? – DavidHyogo

+0

@DavidHyogo - bạn có một jsFiddle hoặc một số mã mẫu? Có vẻ như có điều gì đó đang diễn ra. –

1

tôi đã thêm một dòng khác để xử lý lỗi từ @RPNiemeyer để an ủi nút gây ra lỗi trong khối catch - làm cho nó rất dễ dàng để tìm thấy một lỗi trên một trang phức tạp:

if (console && console.log) { 
      console.log("Error in binding: " + e.message); 
      console.log("Node causing error:"); 
      console.log(node); 
     }