1

首先,与我似乎不想打电话的不同

myStore.rejectChanges();

在过滤的商店中。那将是理想的,但是在检查代码和阅读文档后,我发现它不起作用。我将与一些示例商店合作,并解释我想要做什么来解决这个问题。假设我有两家商店:

<ext:Store ID="productStore" runat="server" UseIdConfirmation="true">
    <Reader>
        <ext:JsonReader IDProperty="productID">
            <Fields>
                <ext:RecordField Name="productID" Type="Int" />
                <ext:RecordField Name="productName" Type="String" />
            </Fields>
        </ext:JsonReader>
    </Reader>
</ext:Store>

记录字段只是帮助理解我的观点的虚假数据。下一家店:

<ext:Store ID="productHistoryStore" runat="server" UseIdConfirmation="true">
    <Reader>
        <ext:JsonReader IDProperty="productHistoryID">
            <Fields>
                <ext:RecordField Name="productID" Type="Int" />
                <ext:RecordField Name="status" Type="String" />
                <ext:RecordField Name="date" Type="Auto" />                          
            </Fields>
        </ext:JsonReader>
    </Reader>
</ext:Store>

productStore 实际上与 productHistoryStore 有 1..1 的关系。这与我真实场景中的产品无关,但我认为使用此示例可能更容易。我会尽量让它更清楚:

productStore.data.items:       productStoreHistory.data.items:

productID: 1                   productID: 1
productName: 'product1'        status: 'available'
                               date: 04/01/2013
productID: 2
productName: 'product2'        productID: 1
                               status: 'unavailable'
productID: 3                   date: 06/01/2013
productName: 'product3'
                               productID: 2
                               status: 'available'
                               date: 04/01/2013

                               productID: 2
                               status: 'unavailable'
                               date: 06/01/2013

                               productID: 2
                               status: 'available'
                               date: 08/01/2013

                               productID: 3
                               status: 'available'
                               date: 04/01/2013

最后,整个事情是如何工作的:projectStore 绑定到一个 GridPanel。单击一行后,它会打开一个模式窗口,其中仅包含有关单击的产品的详细信息:

<RowClick Handler="openHistoryWindow(rowIndex) />

以及处理程序的功能:

var openHistoryWindow = function(rowIndex){
    var productID = productStore.getAt(rowIndex).data.productID);
    productHistoryStore.filter('productID', productID);
    historyWindow.show();
}

实际上,如果有更好的方法来找到点击行的 productID RecordField 的值,我也想知道,只要它不会弄乱这里呈现的整个结构。

最后,我可以直截了当地说:historyWindow 允许用户更改选定的产品状态。规范要求窗口具有“确认”和“取消”按钮。就像我之前说的,实际场景与产品无关,因此它不仅允许用户更改状态(更像是添加新状态;实际上那里还有一堆其他数据),但它允许他删除之前添加的状态,这里是 sh*t 击中粉丝的地方。从绑定 productHistoryStore 的 GridPanel 中删除记录,使用

productHistoryGrid.deleteSelected();

将从 productHistoryStore.data.items 中删除它并即时插入到 productHistoryStore.deleted 中。没关系。如果我打电话给

productHistoryStore.rejectChanges();

取消后,您会认为它会起作用。确实如此,但它是有代价的。在这种情况下,假设我删除了“产品 1”的最后一个状态并确认,然后我删除了“产品 2”的状态并取消了它,rejectChanges() 将恢复“产品 1”的已删除状态为出色地。这是 Ext 的预期行为,但我想知道是否有办法只取消/拒绝实际取消的条目的更改,而不必遍历已删除的数组并“手动”删除它们,这也将迫使我手动将这些条目重新添加到 productHistoryStore.data.items 中,并带有一大堆糟糕的代码作为副产品。

顺便说一句,确认后的 commitChanges() 不是一个选项。服务器端特权。

4

0 回答 0