2013-11-27 33 views
3

为了快速回归测试,我正在寻找一种方法来确保所有KendoUI的东西都已被正确配置和初始化。检测Kendo UI值绑定错误

我面临着一个问题,当我无法检测的情况下,当值绑定路径并没有真正的模式,即在下面的例子存在:

  • 源结合到不存在的物业data-bind="source: AnotherNonExistingProp"引发错误Uncaught TypeError: Cannot read property 'parent' of undefined(这样我就可以检测到它的控制台)
  • 然而,值绑定到不存在的财产data-bind='value: Details.NonExistingProp'抛出任何错误 - 所以我不能保证没有我的观点回归。

HTML:

<form> 
    <div> 
     <label>Name<label> 
     <input data-bind='value: Name' type='text' /> 
    </div> 
    <div> 
     <label>Age<label> 
     <input data-bind='value: Details.NonExistingProp' type='text' /> 
    </div> 
     <table border='1px' data-template="row-template" data-bind="source: anotherNonExistingProp"> 
     </table> 
    </form> 

的JavaScript:

<script type='text/javascript'> 
    $(function() {  
    var carModel = kendo.observable({ 
     Name: 'CarName', 
     Details: { 
      Age: 25 
     }, 
     Parts: [{PartName:'aa'}, 
       {PartName:'bb'}] 
    }); 
     kendo.bind($('form'), carModel);  
    }) 
</script> 

有没有一种方法来检测的情况下,当值绑定使用一个不存在的路径(即当时的物业,由目标路径未定义)?

这里是一个活的jsfiddle example

回答

3

您可以随时绑定到更改事件可观测和检查对象的属性...

viewModel.bind("change", function(e) { 
    if (this[e.field] === undefined) { 
    console.error("The field " + e.field + " cannot be bound because it doesn't exist"); 
    } 
}); 

如果你想获得所有的可以立即观察,您可以抓取根可观察对象并快速绑定到更改。

声明: MVVM是一个微调机。如果你拦截它的功能,并做这样的检查,你可能会放慢速度。这也不会由Kendo UI团队正式支持。你的milage可能会有所不同。

kendo.observable = function(object) { 
    if (!(object instanceof kendo.data.ObservableObject)) { 
    object = new kendo.data.ObservableObject(object); 
    // add a get binding on all observables 
    object.bind("get", function(e) { 
     if (this[e.field] === undefined) { 
     console.error("Cannot bind to the field '" + e.field + "' because it does not exist"); 
     } 
    }); 
    } 

    return object; 
}; 

http://jsbin.com/amOSejUy/1/edit

+0

谢谢!第二种方法很酷。我并不十分担心性能,因为我只能在集成测试环境中执行此操作。 – Isantipov

2

我用上面的代码(@Burke荷兰)的轻微变化与嵌套对象的工作:

kendo.observable = function (object) { 
     if (!(object instanceof kendo.data.ObservableObject)) { 
      object = new kendo.data.ObservableObject(object); 
      // add a get binding on all observables 
      object.bind("get", function (e) { 
       var splitFields = e.field.split('.'); 
       var nestObj = this; 
       for (var i = 0; i < splitFields.length; i++) { 
        nestObj = nestObj[splitFields[i]];   
       } 
       if (nestObj === undefined) { 
        console.error("Cannot bind to the field '" + e.field + "' because it does not exist"); 
       } 
      }); 
     } 

     return object; 
    }; 
+0

谢谢!这很好:-) – Roberto