我想捕获错误,纠正错误并继续执行程序。 http://jsfiddle.net/Gthv9/12/
但是,我不能这样做!
如果你点击:“重新检查模型1”,“重新检查模型3” - 没关系。
如果您点击:“重新检查模型1”,“重新检查模型2”,“重新检查模型3” - 出现错误。
Uncaught Error: Unable to parse bindings.
Message: ReferenceError: name3 is not defined;
Bindings value: text: name3
为什么?
我将问题代码包装在try-catch块(viewModel.recheckData2())中, 但是,应用程序在单击viewModel.recheckData3()!
时崩溃我知道knockoutJS存储了错误状态(new model2()),但不知道该怎么做。
如何正确捕捉错误?
谢谢!
答案 0 :(得分:36)
我不确定我是否理解你的确切目标,但是当Knockout遇到这类问题时会停止绑定。
如果您的问题只是未定义的变量,那么您可以使用的一个技巧是绑定$data.name3
而不仅仅是name3
。从有效对象访问未定义的属性不会导致错误。
如果你真的想要更强大的东西,那么你可以考虑使用custom binding provider。
例如,您可以将快速包装器写入真正的绑定提供程序,如:
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();
这将捕获错误,记录它们并继续。当然,具有这种“坏”绑定的元素不会受到约束。如果有一些已知的方法要处理它,那么您可以在捕获错误后添加该逻辑。也许你想检查那个元素(node)和bindingContext来确定需要做什么。
示例:http://jsfiddle.net/rniemeyer/KxXqs/
更新:这是3.0+版本,用于捕获/记录绑定语法中的错误以及实际评估绑定值时的错误。 http://jsfiddle.net/rniemeyer/ecbn1dmy/
答案 1 :(得分:1)
我从@RPNiemeyer向错误处理程序添加了另一行来控制导致catch块中出错的节点 - 使得在复杂页面上找到错误非常容易:
if (console && console.log) {
console.log("Error in binding: " + e.message);
console.log("Node causing error:");
console.log(node);
}