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

Javascript knockout.js ReferenceError-无法分析绑定$data未定义,javascript,jquery,debugging,knockout.js,jasmine,Javascript,Jquery,Debugging,Knockout.js,Jasmine,我正在编写Jasmine测试,它使用来自WebSQL数据库的模拟数据库响应。在下面的代码段中,我得到一个错误 function createCalculatedField(calculatedValue, objectContext) { var computedObservable = ko.computed({ read: function () { return ko.unwrap(ko.bindingProvider.ins

我正在编写Jasmine测试,它使用来自WebSQL数据库的模拟数据库响应。在下面的代码段中,我得到一个错误

        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参数。同样的代码在生产环境中也能正常工作,所以我假设我没有在某个地方设置什么,你能给我指出如何调试这个问题的方向吗,因为我现在完全没有主意。

在内部,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的值是您的模型

i、 e


但是,由于$data对象中缺少PagingStartIndex,因此在此实例中仍然会收到错误消息,就像您的绑定表达式与生产系统中的模型不匹配一样。

在这种情况下,您能否解释一下使用
ko.bindingProvider.instance.parseBindingsString
方法试图实现的目标?您创建的
ko.computed
的目的是什么?
{
  $data: ko.observableArray: ( [
  {
    Fields:{...}, 
    Insert: false, 
    SetFields:[]
  }, {
    Fields:{}, 
    Insert: false, 
    SetFields: [] 
  }] ),
  $index: ko.observable(),
  ...
}