2017-06-12 72 views
0

假設我們有1個父視圖模型(對應於視口)和2個嵌套(網格和窗口)視圖模型。在網格actioncolumn點擊,我們得到一個記錄ID,將其作爲ajax請求url部分傳遞,並將響應顯示在窗口文本字段中。如果響應中顯示的值沒有顯示默認值。使用extjs在ViewModels之間傳遞數據參數

有趣的部分是,如何使用視圖模型綁定將響應數據傳遞到窗口文本字段。我想出了以下解決方案:

1)在AJAX請求創建使用將通過模型傳遞響應數據的網格視圖模型鏈接,如果需要的話在創建的默認值:

grid.getViewModel().linkTo('custom', { 
    reference: 'CustomModel', 
    create: data 
}); 

Ext.define('CustomModel', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'name', defaultValue: 'default name' }, 
     { name: 'value', defaultValue: 'default value' } 
    ] 
}); 

2)使用公式在網格視圖模型數據發佈到父視圖模型:

formulas: { 
    publishCustom: function(get) { 
     this.set('main.custom', get('custom')); 
    } 
} 

3)填充窗口文本字段與從父(視口中的數據)視圖模型

bind: '{main.custom.name}' 

您可能會發現小提琴here

這似乎有點不明顯,並嚴重創建額外的數據副本。對於這樣的問題,是否有更清潔的解決方案?

+0

爲什麼網格或窗口有一個視圖模型呢?看起來好像請求屬於父容器的級別,因爲它對網格和窗口都有影響。 –

+0

這只是一個簡化的例子,沒有一堆嵌套視圖模型的公式。當一個父視圖模型中有數千行代碼時,閱讀和維護變得有點困難。就我們使用MVC或MVVM模式而言,在自己的視圖模型中使用這種邏輯似乎是正確的。 – fen1ksss

+0

我得到的是,看起來好像執行加載的責任不應該在網格的層次上,因爲該信息需要傳遞給其他組件。這種行爲看起來好像應該控制在任何控制窗口/網格的容器級別。你現在這樣做的方式不是公式的正確使用方式。 –

回答

0

更清晰的方法是將通常訪問的對象僅存儲在頂級主ViewModel中,因爲所有子虛擬機都繼承父虛擬機中的數據對象。

您仍然可以綁定到它們或在公式中使用,就好像它們在子虛擬機中一樣。 請參閱:

ViewModel Data and Inheritance