2012-10-30 8 views
10

Chcę złapać błąd, poprawić go i kontynuować wykonywanie programu. http://jsfiddle.net/Gthv9/12/KnockoutJS catch errors Oprawa

Ale nie mogę tego zrobić!

Po kliknięciu na "re Check On Model1", "re Check On Model3" - wszystko jest w porządku.

Kliknięcie: "ponownie sprawdź model1", "ponownie sprawdź model2", "ponownie sprawdź model3" - wystąpił błąd.

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

Dlaczego?

Zawinęłem kod problemu w bloku try-catch (viewModel.recheckData2()), , ale aplikacja ulega awarii po kliknięciu viewModel.recheckData3()!

Wiem, że knockoutJS przechowuje stan błędu (nowy model2()), ale nie wiem, co powinienem zrobić.

Jak mogę poprawnie złapać błąd?

Dzięki!

Odpowiedz

35

Nie jestem pewien, czy rozumiem twój dokładny cel, ale nokaut przestanie wiązać, gdy napotka na ten typ problemu.

Jeśli Twój problem jest po prostu niezdefiniowanymi zmiennymi, to jedną sztuczką, której możesz użyć, jest powiązanie z $data.name3 zamiast tylko name3. Uzyskanie dostępu do niezdefiniowanej właściwości poza poprawnym obiektem nie powoduje błędu.

Jeśli naprawdę chcesz czegoś bardziej wytrzymałego, możesz rozważyć użycie custom binding provider.

Na przykład, można napisać krótki opakowanie do rzeczywistego wiązania dostawcy jak:

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

To wychwycić błędy, ich zalogować i kontynuować. Oczywiście element, który miał to "złe" wiązanie, nie byłby związany. Jeśli istnieje jakiś znany sposób, w jaki chcesz go obsłużyć, możesz dodać tę logikę po złapaniu błędu. Może chcesz sprawdzić ten element (węzeł) i bindContext, aby określić, co należy zrobić.

Próbka: http://jsfiddle.net/rniemeyer/KxXqs/

UPDATE: Tutaj jest wersja 3.0 lub nowszą, że pułapki/dzienniki błędów w składni wiążącej, jak również błędów, gdy wartość faktycznie związany jest oceniany. http://jsfiddle.net/rniemeyer/ecbn1dmy/

+4

Jesteś guru pucharowej ! :) – zoh

+0

@RP Niemeyer "Uzyskanie dostępu do niezdefiniowanej właściwości poza poprawnym obiektem nie powoduje błędu" - Przypisałem funkcję do właściwości name powiązania szablonu. Jeśli funkcja zwróci undefined, pojawia się rodzaj nieprzenikalnego błędu, który pytający mówi o tym, czy używam $ root, czy $ data, czy tylko nazwę funkcji. Czy w takim przypadku użyłbym pomocy "obliczonej"? – DavidHyogo

+0

@DavidHyogo - czy masz jsFiddle lub jakiś przykładowy kod? Wygląda na to, że dzieje się coś innego. –

1

dodałem kolejną linię do obsługi błędów z @RPNiemeyer pocieszyć węzeł przyczyną błędu w bloku catch - sprawia, że ​​naprawdę łatwe do znalezienia błędu w złożonym stronie:

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