2013-11-27 38 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