KnockoutJS捕获错误绑定(KnockoutJS catch errors Binding)

2019-07-03 11:08发布

我要赶一个错误,改正它,继续执行程序。 http://jsfiddle.net/Gthv9/12/

但是,我不能这样做!

如果你点击“重新检查型号1”,“重新检查Model3” - 这是确定。

如果你点击“重新检查型号1”,“重新检查模型2”,“重新检查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()),但不知道我应该做的。

我怎样才能正确地捕获错误?

谢谢!

Answer 1:

我不知道我理解你确切的目标,但是当它运行到这种类型的问题的淘汰赛将停止结合。

如果您的问题简直是不确定的变量,然后一招,您可以使用是绑定反对$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/



Answer 2:

我添加另一条线从@RPNiemeyer错误处理劝慰节点导致错误在catch块 - 使得它可以很容易找到一个复杂的页面上的错误:

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


文章来源: KnockoutJS catch errors Binding