knockout.js ReferenceError - 无法解析绑定$ data未定义

时间:2014-05-08 15:58:04

标签: javascript jquery debugging knockout.js jasmine

我正在编写使用来自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控制台。

enter image description here

检查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参数。这个相同的代码在生产环境中运行得很好,所以我假设我没有在某处设置某些东西,你能指出我如何调试这个问题的方向,因为我完全没有想法。

1 个答案:

答案 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,您仍会收到错误消息,就像绑定表达式与生产系统中的模型不匹配一样。

相关问题