- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
ExtJS 4.1.0
13 年 6 月 6 日更新 :
我在 Sencha 论坛上发布了同样的问题,那里没有太多的行动。该帖子或多或少相同,但我想我会在这里添加它仅供引用。我仍然渴望听到其他社区成员对 ExtJS 应用程序中必须是非常常见的场景的意见!
http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores
13 年 7 月 16 日更新(结论?)
Sencha 帖子引起的讨论很少。我决定将大部分复杂保存操作的负载放在我的应用程序服务器上,并在需要的地方延迟刷新客户端存储。通过这种方式,我可以使用我自己的数据库包装器来包含与一个复杂域对象保存相关的所有事务,以保证原子性。如果保存新 Order
包括保存订单元数据、OrderContents
的十个新实例。以及潜在的其他信息(位于其他表中的地址、创建订单时定义的新客户等)我更愿意将有效负载发送到应用程序服务器,而不是在客户端应用程序中建立一个粗俗的回调网络代码。以一对一方式关联的数据(例如 Order
hasOne Address
)在 success
中更新Order.save()
的回调手术。更复杂的数据,如 Order
的内容,只需调用 contentStore.sync()
就可以懒惰地处理. 我觉得这是在没有大量客户端回调的情况下保证原子性的方法
原帖内容
考虑到保存关联重模型的整体令人失望的功能,我在我的应用程序中几乎抛弃了模型关联,并依靠自己检索关联数据。这一切都很好,但不幸的是并没有解决实际保存数据和更新 ExtJS 存储以反射(reflect)服务器上的更改的问题。
以保存 Order
为例对象,由元数据和 OrderContents
组成即订单上的零件。元数据以 Order_Data
结尾数据库中的表,而所有内容都以 Order_Contents
结尾表中的每一行都通过 order_id
链接到父订单柱子。
在客户端,检索订单内容非常容易,无需任何关联:var contents = this.getContentsStore().query('order_id', 10).getRange()
.然而,一个主要的缺陷是这取决于 OrderContents
中可用的内容记录ExtJS 商店 ,如果我使用的关联不是由数据服务器返回的“main”对象,这将适用。
保存订单时,我发送一个请求,其中包含订单的元数据(例如,日期、订单号、供应商信息等)以及一系列内容。这些数据被挑选出来并保存到相应的表中。这对我来说很有意义并且效果很好。
一切都很好,直到从应用程序服务器返回保存/更新的记录。由于该请求是通过调用 OrderObject.save()
来触发的。 ,没有什么可以告诉 OrderContents
存储新记录可用。如果我将记录添加到商店并调用 .sync()
,这将自动处理。 ,但我觉得这会使保存过程复杂化,我宁愿在应用程序服务器上处理这种解耦,更不用说,保存整个请求也很好。
有没有更好的方法来解决这个问题?我目前的解决方案如下...
var orderContentsStore = this.getOrderContentsStore();
MyOrderObject.save({
success: function(rec, op){
// New Content Records need to be added to the contents store!
orderContentsStore.add(rec.get('contents')); // Array of OrderContent Records
orderContentsStore.commitChanges(); // This is very important
}
});
commitChanges()
添加到商店的记录被认为是干净的(非幻影,非脏),因此商店的
getModifiedRecords()
不再返回。方法;正确的,以便在发生
store.sync()
时不应将记录传递到应用程序服务器。 .
最佳答案
13 年 8 月 26 日更新 我发现关联数据确实是由 Ext 在模型代理的创建/更新回调中处理的,但是找到这些数据并不容易...请参阅我的帖子:ExtJS 4.1 - Returning Associated Data in Model.Save() Response
好吧,这个问题已经有几个月了,我觉得这个问题没有神奇的解决方案。
我的解决方法如下...
当保存一个复杂的模型(例如,一个模型有或确实有几个 hasMany
关联)时,我保存包含所有关联数据的“父”模型(作为模型上的属性/字段!),然后添加afterSave/afterUpdate 回调中的(保存的)关联数据。
以我的 PurchaseOrder
为例型号hasMany
Items
和 hasOne
Address
.请注意,关联数据包含在模型的属性中,因为如果它仅存在于模型的关联存储中,则不会传递到服务器。
console.log(PurchaseOrder.getData());
---
id: 0
order_num: "PO12345"
order_total: 100.95
customer_id: 1
order_address: Object
id: 0
ship_address_1: "123 Awesome Street"
ship_address_2: "Suite B"
ship_city: "Gnarlyville"
ship_state: "Vermont"
ship_zip: "05401"
...etc...
contents: Array[2]
0: Object
id: 0
sku: "BR10831"
name: "Super Cool Shiny Thing"
quantity: 5
sold_price: 84.23
1: Object
id: 0
sku: "BR10311"
name: "Moderately Fun Paddle Ball"
quantity: 1
sold_price: 1.39
Models
为
PurchaseOrder.Content
建立和
PurchaseOrder.Address
,但数据在
PurchaseOrder
不是这些模型的实例,而只是数据。同样,这是为了确保将其正确传递到应用程序服务器。
.save()
将它发送到我的应用程序服务器如下:
PurchaseOrder.save({
scope: me,
success: me.afterOrderSave,
failure: function(rec,op){
console.error('Error saving Purchase Order', op);
}
});
afterOrderSave: function(record, operation){
var me = this;
switch(operation.action){
case 'create':
/**
* Add the records to the appropriate stores.
* Since these records (from the server) have an id,
* they will not be marked as dirty nor as phantoms
*/
var savedRecord = operation.getResultSet().records[0]; // has associated!
me.getOrderStore().add(savedRecord);
me.getOrderContentStore().add(savedRecord.getContents()); //association!
me.getOrderAddressStore().add(savedRecord.getAddress()); // association!
break;
case 'update':
// Locate and update records with response from server
break;
}
}
PurchaseOrder
并相应地处理保存数据。我不会详细介绍这个过程,因为这个过程在很大程度上取决于你自己的实现。我的应用程序框架松散地基于 Zend 1.11(主要利用
Zend_Db
)。
success
回调方法可以简单地reload
商店。 关于javascript - ExtJS 和复杂的保存操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16551901/
我带着这么简单的问题来到这里,但找不到它......无论如何,你可以在下面看到代码。这是里面有项目的面板。我想要的是更改名称为“intIP”的文本字段的值,它位于面板内部,位于面板内部。我怎样才能做到
如何在 ExtJS 设计中显示面包屑功能。 我正在使用带边框布局的面板,我想在面板顶部设计面包屑功能 请寄给我一些 sample ..... 提前致谢 最佳答案 我想到了两个解决方案。 使用面板标题
你好 如何在 ExtJS 中设计嵌套网格 请提供一些示例(如何在 ExtJS GridPanel 中使用 RowExpander) 最佳答案 尝试这样的事情: //Create the Row Ex
我有类似的东西 Ext.define('HS.controller.Utility', { statics : { state : 'Oklahoma' } }); 现在我想
我有一列checkcolumn类型来启用切换 bool 值。我希望能够一次为该值切换所有行。理想情况下,我可以在checkcolumn header 中添加一个复选框,并监听更改。那可能吗? 我想指出
在我的 extjs 项目中,我有一些 panel我要展示的toolbar在 mouseEnter事件。这工作正常。但是当我用新的 html 更新面板时,mouseenter事件不起作用。 panel.
如何在 ExtJs Combo 中显示图标和显示字段。extjs 组合是否有任何扩展。请提供一些 sample 。 最佳答案 对于 ExtJS4,将带有 getInnerTpl 方法的 listCon
我有用于网格和柱状图的存储,但值是字符串形式的(服务器端格式化的数量,不能在客户端完成)。由于字符串格式的数量,网格没有被呈现。解决方案可能会使用网格和图表所需的数据类型制作单独的存储。但这是低效的方
我正在一个页面上有一个GridPanel的项目中工作。该面板可以显示任意数量的行,并且我设置了autoHeight属性,这将导致GridPanel扩展以适合行数。我现在想要一个水平滚动条,因为在某些分
我有一个网格,它允许用户通过编辑行来输入数字。我希望数字支持 4 位小数,但它只支持 2 位。我想出了如何显示 4 位小数,但它没有注册超过 2 位小数。 因此,如果用户输入 1000.1111,结果
我这里有以下网格: Ext.define('AM.view.user.List', { extend: 'Ext.grid.Panel', alias: 'widget.userlis
我正在将我的应用程序从ExtJs 3迁移到4版本。 我的formPanel上有几个组合框,以前我用过hiddenName 以及所有的stuff提交valueField而不是displayField。
我在一个面板中创建了多个项目。现在我想以“适合”布局显示此面板。我不想修复该面板的高度和宽度。我知道“适合”布局只允许显示一项。 这里可以使用“适合”布局吗?或者有什么替代方案可以实现这一目标吗? 谢
我需要将数据库值加载到组合框中。我不明白,为什么值没有加载到组合框中。通过 firebug,打印出 console.log 值。这是我的组合框代码, var groups = new Ext.data
这是将筛选器动态添加到gridpanel底部工具栏的正确语法吗? this.Grid.getBottomToolbar().plugins=[filters]; 当我这样做时没有错误。但是,它的行为并
我正在使用ExtJS v4.0。 在客户端和服务器端之间维护日期格式确实令人困惑。 用户需要自己的输入格式,但是服务器通常要求提交为一种标准格式。 它应该是ExtJS中的内置实现,但不是。 我已经阅读
我的问题对你来说很容易,但我负担不起..我从行中获取数据并显示在其他面板的字段中我的目标是编辑这些数据并在网格中显示编辑后的数据,请给我一些建议,我知道它需要 commit() 函数但是.. 我的代码
我是 ExtJS 的新手。我遵循了一个教程,目的是在网格上创建分页。代码很简单,我发现它很可疑......结果,分页工具栏在那里,但在第一次加载时仍然显示所有数据。这是我在 View 文件中的代码:
听说EXTJS是一个独立于浏览器的javascript库。 extjs 如何使自己独立于浏览器?当我打开库类时,我没有看到任何代码: 如果(IE)//这样做;else if (FF)//做其他事情;
我有一个类的实例(例如 Ext.data.Model)myRecord 并且需要调用它的静态方法之一(例如 getFields())。我该怎么做? 最佳答案 您还可以使用 self获取类的属性: my
我是一名优秀的程序员,十分优秀!