2015-05-06 81 views
1

讓我們說我們有這樣的觀點: mockup爲什麼在視圖完全呈現之前觸發小部件的事件?

<script id="my-view" type="text/x-kendo-template"> 
    <div> 
      <input data-text-field="name" 
        data-value-field="id" 
        data-role="dropdownlist" 
        data-bind="source:wellDataSource,events:{change:onWellChange,dataBound:onWellDataBound}" /> 
      <div data-role="tabstrip" data-bind="visible:isAnyWellExist"> 
      <ul class="bd-doc-navigation-tabstrip" data-freezable="false"> 
       <li class="k-state-active">Home</li> 
       <li>Products</li> 
       <li>About</li> 
       <li>...</li> 
      </ul> 
    </div> 
</script> 

JS:

var _view = new kendo.View("my-view", { model: _viewModel}); 
_view.render("#container"); 

當我渲染視圖我希望所有這三個部件渲染,然後將它們的事件觸發,但是當下拉列表渲染完成它的數據綁定數據綁定事件發生前tabstr IP網格呈現。所以我無法在這些事件中訪問標籤條網格小部件。

爲什麼會發生這種情況?是否有任何解決方案或解決方法,以確保事件發生後視圖呈現totaly?

+0

**我大關以下的答案必須爲接受的答案,但我的問題,任何更詳細的回答感謝** –

回答

1

劍道的DropDownList具有DataSource,FYI事件DataBindingDataBound當數據已經從服務器收集自動觸發。

因此,要防止它這樣做,你必須防止DropDownList的數據初始化。您可以將DropDownList AutoBind屬性更改爲false,因此在初始化階段它不會向服務器發出請求。頁面完全呈現後,您可以觸發其DataSource以調用read方法。

您的代碼應該是這樣的

<input data-text-field="name" 
     data-value-field="id" 
     data-role="dropdownlist" 
     data-bind="source:wellDataSource,events: change:onWellChange,dataBound:onWellDataBound}" 
     data-auto-bind="false" /> 

$(document).ready(function() { 
    $("#dropdown").data().kendoDropDownList.dataSource.read(); 
}); 

Kendo DropDownList AutoBind Documentation

+0

感謝兄弟,你的回答引導我到最終的解決方案(解決方法),通過它迫使我額外的編碼,並始終關心設置自動綁定爲false,並調用數據源。另一件要提到的是,'fetch()'比'read()'更聰明,因爲每次調用時都會向服務器發送請求。 –

+0

是的,這取決於你的用戶界面如何工作,以及你使用的是什麼類型的小部件。祝您好運:D –

+0

**我將此答案標記爲已接受的答案,但有關我的問題的更詳細的答案讚賞** –

0

每個小部件彼此獨立並且相互平行加載,所以很有可能一個小部件具有完全的數據綁定而另一個小部件尚不存在。事件不會等待頁面完全加載。

取決於你如何實現它,一個變通可以將您的代碼訪問標籤欄和電網:

$(document).ready(function() { 
    ... 
}); 

要強制劍道數據源的行爲同步,你可以嘗試配置您的數據源與運輸async: false

var datasource = new kendo.data.DataSource({ 
    transport: { 
     read: { 
      async: false, 
      url: function (data) { 
       return "/Home/Product"; 
      }, 
      dataType: "json" 
     }, 
    }, 
}); 

我找到了一種方法,檢查所有部件已綁定。見here

實施例:

<script> 
    $(document).ready(function() { 
     var promises = []; 

     var change = function() { 
      this.deferred.resolve(); 
     } 

     var categories = $("#categories").kendoDropDownList({ 
      dataTextField: "CategoryName", 
      dataValueField: "CategoryID", 
      dataSource: { 
       type: "odata", 
       serverFiltering: true, 
       transport: { 
       read: "http://demos.kendoui.com/service/Northwind.svc/Categories" 
      }, 
      requestStart: function() { 
       this.deferred = $.Deferred(); 
       promises.push(this.deferred.promise()); 
      } 
      } 
     }).data("kendoDropDownList"); 

     var products = $("#products").kendoDropDownList({ 
      dataTextField: "ProductName", 
      dataValueField: "ProductID", 
      dataSource: { 
       type: "odata", 
       serverFiltering: true, 
       transport: { 
        read: "http://demos.kendoui.com/service/Northwind.svc/Products" 
       }, 
       requestStart: function() { 
        this.deferred = $.Deferred(); 
        promises.push(this.deferred.promise()); 
       } 
      } 
     }).data("kendoDropDownList"); 

     categories.dataSource.bind("change", change); 
     products.dataSource.bind("change", change); 

     $.when.apply(null, promises) 
      .done(function() { 
       console.log("done"); 
       console.log(categories.value()); 
       console.log(products.value()); 
     }); 
    }); 
</script> 
+0

感謝花花公子,但我們正在寫一具有嵌套視圖的複雜SPA,我們需要在文檔準備好後多次執行此操作,因此文檔準備就無法幫助我們。對於我來說,如果JS是單線程的,那麼爲什麼在另一個方法(渲染)沒有完全運行的時候觸發事件呢?任何其他想法或幫助? –

+0

Kendo UI執行Ajax調用來填充它的小部件。這些默認情況下是異步的。也許禁用這可能會幫助你,不知道。 – Nicholas

+0

通過設置「async:false」,渲染視圖的其餘部分暫停,直到ajax從服務器獲得響應。所以它不能解決問題。我弄清楚另一件事,但不確定是_databound_在所有小部件渲染後發生,但下一次出現問題是因爲此時數據在_datasource_中已準備就緒,並且小部件綁定到_datasource_它會觸發_databound_事件。 –

相關問題