我在调试KnockoutJS模板中的问题时一直遇到麻烦。

假设我想绑定到一个名为“items”的属性,但在模板中我犯了一个错字,并绑定到(不存在的)属性“item”。

使用Chrome调试器只告诉我:

“item”没有定义。

是否有工具、技术或编码风格可以帮助我获得关于绑定问题的更多信息?


当前回答

在JavaScript库文件中定义一次bindingHandler。

ko.bindingHandlers.debug = 
{
    init: function(element, valueAccessor) 
    {
        console.log( 'Knockoutbinding:' );
        console.log( element );
        console.log( ko.toJS(valueAccessor()) );
    }
};

而不是像这样简单地使用它:

<ul data-bind="debug: $data">

优势

使用Chrome调试器的全部功能,如元素面板中的显示 您不必向DOM添加自定义元素,只是为了调试

其他回答

如果您使用Chrome进行开发,有一个非常棒的扩展(我没有加入)称为Knockoutjs上下文调试器,它直接在开发人员工具的元素面板中向您显示绑定上下文。

如果你是在Visual studio和IE中开发,我更喜欢这样data-bind="somebinding:(函数(){调试器;返回bindvalue;}) ()我喜欢它比echo函数,因为它会去脚本与所有的绑定,而不是eval文件,你可以只看$context $data(我在Chrome中也使用这个);

查看哪些数据被传递给绑定的最简单方法是将数据拖放到控制台:

<div data-bind="text: console.log($data)"></div>

Knockout将计算文本绑定的值(实际上这里可以使用任何绑定)并将$data刷新到控制台浏览器面板。

我创建了一个名为knock - through.js的github项目来帮助可视化这些错误。

https://github.com/JonKragh/knockthrough

它突出显示绑定错误,并提供该节点上的数据上下文的转储。

你可以在这里玩一个例子:http://htmlpreview.github.io/?https://github.com/JonKragh/knockthrough/blob/master/default.htm

感谢RP Niemeyer,他在SO上出色的Knockout代码示例让我走到这一步。

我经常做的一件事是,当在某个范围内存在数据可用的问题时,将模板/节替换为如下内容:

<div data-bind="text: ko.toJSON($data)"></div>

或者,如果你想要一个可读性稍强的版本:

<pre data-bind="text: JSON.stringify(ko.toJS($data), null, 2)"></pre>

这将输出在该范围内绑定的数据,并让您确保适当地嵌套了内容。

更新:从KO 2.1开始,你可以将其简化为:

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre>

现在参数被传递给JSON.stringify。