我在调试KnockoutJS模板中的问题时一直遇到麻烦。
假设我想绑定到一个名为“items”的属性,但在模板中我犯了一个错字,并绑定到(不存在的)属性“item”。
使用Chrome调试器只告诉我:
“item”没有定义。
是否有工具、技术或编码风格可以帮助我获得关于绑定问题的更多信息?
我在调试KnockoutJS模板中的问题时一直遇到麻烦。
假设我想绑定到一个名为“items”的属性,但在模板中我犯了一个错字,并绑定到(不存在的)属性“item”。
使用Chrome调试器只告诉我:
“item”没有定义。
是否有工具、技术或编码风格可以帮助我获得关于绑定问题的更多信息?
当前回答
这个答案是基于Dirk Boer的答案。我添加到他的处理程序,使它也显示数据时,它正在更新:
ko.bindingHandlers.debug =
{
init: function(element, valueAccessor)
{
console.log( 'Knockoutbinding (init):', element, ko.toJS(valueAccessor()));
},
update: function(element, valueAccessor)
{
console.log( 'Knockoutbinding (update):', element, ko.toJS(valueAccessor()));
}
};
然后,你所要做的就是在HTML代码中添加一个像这样的绑定:
<div data-bind="debug: $data">
在初始化或更新console.log时,您将在console.log中看到数据。
其他回答
看看我用的一个非常简单的东西:
function echo(whatever) { debugger; return whatever; }
Or
function echo(whatever) { console.log(whatever); return whatever; }
然后在html中,你有:
<div data-bind="text: value"></div>
把它替换成
<div data-bind="text: echo(value)"></div>
更高级的:
function echo(vars, member) { console.log(vars); debugger; return vars[0][member]; }
<div data-bind="text: echo([$data, $root, $parents, $parentContext], 'value')"></div>
享受:)
更新
另一个恼人的事情是当你试图绑定到一个未定义的值。在上面的例子中,假设数据对象只是{}not {value: 'some text'}。在这种情况下,你会遇到麻烦,但通过以下调整,你会没事的:
<div data-bind="text: $data['value']"></div>
这个答案是基于Dirk Boer的答案。我添加到他的处理程序,使它也显示数据时,它正在更新:
ko.bindingHandlers.debug =
{
init: function(element, valueAccessor)
{
console.log( 'Knockoutbinding (init):', element, ko.toJS(valueAccessor()));
},
update: function(element, valueAccessor)
{
console.log( 'Knockoutbinding (update):', element, ko.toJS(valueAccessor()));
}
};
然后,你所要做的就是在HTML代码中添加一个像这样的绑定:
<div data-bind="debug: $data">
在初始化或更新console.log时,您将在console.log中看到数据。
我经常做的一件事是,当在某个范围内存在数据可用的问题时,将模板/节替换为如下内容:
<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。
所有其他的答案都很好,我只是添加了我喜欢做的事情:
在你的视图中(假设你已经绑定了一个ViewModel):
<div data-bind="debugger: $data"></div>
淘汰赛代码:
ko.bindingHandlers.debugger = {
init: function (element, valueAccessor) {
debugger;
}
}
这将暂停调试器中的代码,element和valueAccessor()将包含有价值的信息。
这对我来说很管用:
<div data-bind="text: function(){ debugger; }()"></div>