我正在编写使用来自WebSQL数据库的模拟数据库响应的Jasmine测试。在以下代码段中,我收到错误。
function createCalculatedField(calculatedValue, objectContext) {
var computedObservable = ko.computed({
read: function () {
return ko.unwrap(ko.bindingProvider.instance.parseBindingsString("text: " + calculatedValue, objectContext).text);
},
write: function (value) {
computedObservable.notifySubscribers(value);
},
owner: objectContext
});
我得到的错误信息如下:
ReferenceError: Unable to parse bindings. Bindings value: text: ko.unwrap(PagingStartIndex) + $context().length Message: $data is not defined
我已打印出功能输入,并在下面的屏幕截图中将错误重现到Chrome控制台。
检查knockout-3.0.0.custom.min.js parseBindingsString方法失败。
function (b,c,d,e){try{var f=this.bindingCache,h=b+(e&&e.valueAccessors||""),g;if(!(g=f[h])){var n,k="with($context){with($data||{}){return{"+a.expressionRewriting.preProcessBindings(b,e)+"}}}";n=new Function("$context","$element",k);g=f[h]=n}return g(c,d)}catch(p){throw p.message="Unable to parse bindings.\nBindings value: "+
b+"\nMessage: "+p.message,p;}}
我可以看到$data
是内部knockout.js参数。这个相同的代码在生产环境中运行得很好,所以我假设我没有在某处设置某些东西,你能指出我如何调试这个问题的方向,因为我完全没有想法。
答案 0 :(得分:2)
在内部,Knockout使用以下动态函数来评估表达式
function($context, $element) {
with($context) {
with($data||{}) {
return {text: ko.unwrap(PagingStartIndex) + $context().length};
}
}
}
如果你看一下通常被淘汰传递给parseBindingsString的对象,它看起来像......
{
$data: {...},
$index: ko.observable(),
$parent: {...},
$parentContext: ko.bindingContext,
$parents: [...],
$root: {...}
}
此对象图通常是通过调用new ko.bindingContext(...)
创建的,或者,如果您在自定义绑定中,则bindingContext.createChildContext(...)
查看截图,看起来objectContext是一个包含2个元素的observableArray,我还假设你在jasmine测试中手动创建了objectContext实例。
因此,传递给parseBindingString的对象(作为$ context进入动态函数)没有$ data字段,这就是抛出异常的原因。
对象图应该与普通的bindingContext对象类似,其中$ data的值是你的模型
即
{
$data: ko.observableArray: ( [
{
Fields:{...},
Insert: false,
SetFields:[]
}, {
Fields:{},
Insert: false,
SetFields: []
}] ),
$index: ko.observable(),
...
}
但是,在这个实例中,由于$ data对象中缺少PagingStartIndex,您仍会收到错误消息,就像绑定表达式与生产系统中的模型不匹配一样。