KnockoutJS捕获错误绑定

zoh*_*zoh 10 javascript knockout.js

我想捕获一个错误,纠正它并继续执行程序. 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 
Run Code Online (Sandbox Code Playgroud)

为什么?

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

我知道knockoutJS存储了错误状态(new model2()),但不知道该怎么办.

如何正确捕获错误?

谢谢!

RP *_*yer 36

我不确定我是否理解你的确切目标,但是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();
Run Code Online (Sandbox Code Playgroud)

这会捕获错误,记录它们并继续.当然,具有这种"坏"绑定的元素不会受到约束.如果有一些已知的方法要处理它,那么您可以在捕获错误后添加该逻辑.也许你想要检查那个元素(node)和bindingContext来确定需要做什么.

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

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

  • 你是大师淘汰赛!:) (4认同)