10

我想捕捉一个错误,纠正它并继续执行程序。 http://jsfiddle.net/Gthv9/12/

但是,我做不到!

如果你点击:“re Check On Model1”,“re Check On Model3”——没关系。

如果您点击:“re Check On Model1”、“re Check On Model2”、“re Check On Model3” - 出现错误。

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

为什么?

我将问题代码包装在 try-catch 块(viewModel.recheckData2() )中,但是,应用程序在单击 viewModel.recheckData3() 时崩溃!

我知道 knockoutJS 存储错误状态(新 model2()),但不知道我应该做什么。

如何正确捕获错误?

谢谢!

4

2 回答 2

37

我不确定我是否了解您的确切目标,但当遇到此类问题时,Knockout 将停止绑定。

如果您的问题只是未定义的变量,那么您可以使用的一个技巧是绑定$data.name3而不是仅仅绑定name3. 访问有效对象的未定义属性不会导致错误。

如果您真的想要更健壮的东西,那么您可以考虑使用自定义绑定提供程序

例如,您可以为真正的绑定提供者编写一个快速包装器,例如:

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

这将捕获错误、记录它们并继续。当然,具有这种“坏”绑定的元素不会被绑定。如果有一些已知的方法要处理它,那么您可以在捕获错误后添加该逻辑。也许您想检查该元素(节点)和 bindingContext 以确定需要做什么。

示例:http: //jsfiddle.net/rniemeyer/KxXqs/

更新:这是 3.0+ 的版本,它捕获/记录绑定语法中的错误以及实际评估绑定值时的错误。http://jsfiddle.net/rniemeyer/ecbn1dmy/

于 2012-10-30T13:55:49.403 回答
1

我在 @RPNiemeyer 的错误处理程序中添加了另一行,以控制导致 catch 块中错误的节点 - 使得在复杂页面上查找错误变得非常容易:

if (console && console.log) {
            console.log("Error in binding: " + e.message);
            console.log("Node causing error:");
            console.log(node);
        }
于 2014-08-23T05:07:50.260 回答