我很好奇为什么Model.save()
响应结果集中包含的记录没有正确返回更新的关联数据,尽管服务器响应中包含更新的数据...
示例模型和商店定义:
Ext.define("App.model.test.Parent",{
extend: 'Ext.data.Model',
requires: ['App.model.test.Child'],
fields: [
{name: 'id', type: 'int' },
{name: 'name', type: 'string'},
{name: 'kids', type: 'auto', defaultValue: []}
],
idProperty: 'id',
hasMany: [{
foreignKey: 'parent_id',
model: 'App.model.test.Child',
associationKey: 'kids',
name: 'getKids'
}],
proxy: {
type: 'ajax',
api : {
create: '/service/test/create/format/json',
read : '/service/test/read/format/json',
update : '/service/test/update/format/json'
},
reader: {
idProperty : 'id',
type : 'json',
root : 'data',
successProperty : 'success',
messageProperty : 'message'
},
writer: {
type : 'json',
writeAllFields …
Run Code Online (Sandbox Code Playgroud) ExtJS 4.1.0
2013年6月6日更新:
我在Sencha论坛上发布了同样的问题,但没有采取太多行动.帖子或多或少相同,但我想我会在这里添加它仅供参考.我仍然渴望听到其他社区成员对ExtJS应用程序中一个非常常见的场景的意见! http://www.sencha.com/forum/showthread.php?265358-Complex-Model-Save-Decoupling-Data-and-Updating-Related-Stores
2013年7月16日更新(结论?)
Sencha帖子很少讨论.我决定将大部分复杂的保存操作加载到我的应用程序服务器上,并在需要时懒洋洋地刷新客户端存储.这样我就可以使用自己的数据库包装器来包含与一个复杂域对象保存相关的所有事务,以保证原子性.如果保存新的Order
包括保存订单元数据,十个新实例OrderContents
和可能的其他信息(驻留在其他表中的地址,订单创建时定义的新客户等),我宁愿将有效负载发送到应用程序服务器,而不是在客户端应用程序代码中建立一个粗俗的回调网络.在操作的回调中更新在一对一的基础上关联的数据(例如Order
hasOne Address
).更复杂的数据,例如内容,通过简单的调用就可以轻松处理.我觉得这是保证原子性的手段,没有大量的客户端回调success
Order.save()
Order
contentStore.sync()
原帖子内容
鉴于保存关联模型的整体令人失望的功能,我在应用程序中除了抛弃模型关联外,还依赖于自己检索相关数据.这一切都很好,但遗憾的是无法解决实际保存数据和更新ExtJS存储以反映服务器上的更改的问题.
例如,保存一个Order
对象,该对象由元数据以及OrderContents
订单中的部件组成.元数据最终在Order_Data
数据库中的表中,而内容都以Order_Contents
表格形式结束,其中每一行通过order_id
列链接到父订单.
在客户端上,检索订单的内容非常容易,无需任何关联:var contents = this.getContentsStore().query('order_id', 10).getRange()
.然而,一个主要的缺陷是,这是在OrderContents
ExtJS商店中可用的内容记录,如果我使用的数据服务器没有使用"主"对象返回的关联,这将适用.
保存订单时,我发送一个包含订单元数据的请求(例如,日期,订单号,供应商信息等)以及一系列内容.这些数据被挑选出来并保存到适当的表中.这对我来说足够的意义并且运作良好.
一切顺利,直到从应用程序服务器返回保存/更新的记录.由于通过调用a来触发请求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 …
Run Code Online (Sandbox Code Playgroud) EXTJS 4.1
我遇到了一个难题,并希望听到其他开发人员关于ExtJS事件和控制器方法的情况.我理解这个主题已经在很多场合被讨论和辩论,但我觉得它可以使用更多钻研.
按照标准做法,我在Controller的init()
方法声明中定义事件监听器,如下所示:
Ext.define("My.controller.Awesome", {
init: function(application){
/** Observe some Views */
this.control({
'my-awesome-view #saveButton':{
click: this.saveMyData
}
});
/** Listen for Events, too! */
this.on({
showAwesomeView: this.showMyAwesomeView
});
/** Application events, what fun! */
this.application.on({
showThatAwesomeView: this.showMyAwesomeView
});
}
Run Code Online (Sandbox Code Playgroud)
现在,我愉快地去了解一些其他的控制器编码的一些功能,我觉得自己需要调用showMyAwesomeView
的My.controller.Awesome
.我可以用几种不同的方式做到这一点......
Ext.define("My.controller.Other", {
/* ... class definition */
someImportant: function(){
// I can do this (Approach #1)
this.application.getController("Awesome").showMyAwesomeView();
// Or I can do this (Approach #2)
this.application.getController("Awesome").fireEvent("showAwesomeView");
// Last but not least, I …
Run Code Online (Sandbox Code Playgroud) 首先:我在这里已经意识到这个问题:在ExtJS中,调用Model.save()或Store.Sync()会更好吗? - 但是我希望进一步研究这个问题,特别是在最小化客户端和服务器上的XHR和不必要的开销方面.我不认为在相关问题中解决了这些问题.
我有一个用于企业资源管理的大型应用程序,包括许多模型,视图和控制器.我通过建立Ext.Ajax requestComplete
和requestException
事件的监听器来处理来自我的服务器的所有响应.我采用这种方法而不是在每个模型的代理afterRequest
事件上编写重复的事件处理程序.这使我有我所有的后端(使用Zend Framework)控制器,具有三个参数响应:success
,message
和data
.
在成功请求(即HTTP 200)之后,运行for的方法requestComplete
将检查上述参数的JSON响应.如果success
是false
,则预计将包含错误消息message
,然后将其显示给用户(例如,"保存该产品时出现问题.产品名称无效").如果成功,则根据请求的类型采取操作,即创建,读取,更新或销毁.成功后create
,新记录被添加到相应的数据存储中,删除后记录被销毁,依此类推.
我选择采用这种方法,而不是将记录添加到商店并调用商店的sync
方法,以便最小化XHR和其他往返.我目前保存/更新数据的方法是将请求发送到后端并对Ext前端的结果做出反应.我这样做是通过使用数据填充模型并为创建/更新请求调用model.save()或使用model.destroy()来删除数据.
我发现当从商店添加/更新/删除记录,然后调用store.sync()时,我将不得不以一种让人觉得尴尬的方式对服务器的响应作出反应.例如,删除记录:
store.remove()
store.sync()
因为我有商店的autoSync
设置而调用false
.success: false
,但是记录将已从ExtJS数据存储中删除.store.sync()
,store.load()
(都需要往返)或者从该请求的记录,并将其重新添加到商店后面是commitChanges()
避免调用额外的同步/负载和因此避免不必要的往返.添加记录也是如此,如果服务器在向数据库添加数据时某处失败,则记录仍在ExtJS存储中,必须手动删除以避免使用store.sync()
或者往返store.load()
.
为了避免这个问题,正如我之前解释的那样,我实例化了我的一个模型对象(例如产品模型),用数据填充它,然后调用myModel.save()
.反过来,这会调用代理create
或update
依赖于模型的ID,并触发相应的AJAX请求.如果后端发生故障,前端存储仍未更改.在成功的请求(读取:success: true
,而不是HTTP 200)上,我手动将记录添加到存储并调用store.commitChanges(true)
,有效地将存储与数据库同步,而无需额外的往返并避免不必要的开销.对于所有请求,服务器将使用新的/修改的数据以及成功参数进行响应,并有条件地在客户端上显示消息.
我在这里遗漏了什么,或者这种方法是否是最小化XHR和服务器/客户端开销的好方法?我很乐意提供应该请求的示例代码,但我觉得这是一个基本代码的相当普遍的概念.
在对我的iOS 6应用程序进行了一些更改后(其中没有一个实际上与网络有关),我开始遇到一个奇怪的错误,我的流事件处理程序.这在iOS 5和iOS 6上都会发生,但在iOS 5上更频繁.这个错误每50秒发生一次,我的流事件处理程序遇到了NSStreamEventErrorOccurred
.错误信息如下:
Application[6370:707] Error Occured with stream [<__NSCFInputStream: 0xd622ab0>]
Application[6370:707] Stream Status: 7
Application[6370:707] Error Code: 57
Application[6370:707] Error Desc: The operation couldn’t be completed. Socket is not connected
Application[6370:707] Error Reason: Socket is not connected
Application[6370:707] Error Domain: NSPOSIXErrorDomain
Run Code Online (Sandbox Code Playgroud)
发生此错误后,处理程序将遇到一对'连接重置对等'TCP错误,我认为这是由服务器发送RST数据包引起的.是否有任何其他方案可能导致此错误?我的应用程序正在连接到以AP模式广播wifi网络的硬件设备.
以下是我的NSStreamEventHasBytesAvailable
活动代码.
case NSStreamEventHasBytesAvailable: {
NSLog(@"Stream has bytes available! Stream is %@", stream);
if (stream == iStream)
{
@try {
uint8_t buf[2048];
unsigned int len = 0;
len = [(NSInputStream *)stream …
Run Code Online (Sandbox Code Playgroud) 已解决 - 请看Darren对此问题的工作决议的回应.
您好,感谢您抽出宝贵时间阅读我的问题.
检测到释放时,我遇到了一些奇怪的行为IBAction UIButton
:当我将手掌移过界面时,检测到按钮按下,但释放不是!
我有一组控件,每个控件都有自己的控件IBAction UIButton
.以下是我的按钮如何反应和行为的示例:
- (IBAction)up1start:(id)sender
{
if(!buttonIsPressed && deviceIsConnected)
{
NSLog(@"BUTTON UP 1 PRESSED!");
NSString *byteString = @"7E 01";
sendTimer =[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(sendByte:) userInfo:byteString repeats:YES];
buttonIsPressed = true;
}else{
NSLog(@"Cant press two buttons or connection is closed");
}
}
- (IBAction)up1stop:(id)sender
{
NSLog(@"BUTTON UP 1 RELEASED!");
[ self buttonRelease ];
}
Run Code Online (Sandbox Code Playgroud)
我附加了以下事件UIButton up1
- 由于我正在进行的故障排除工作,可能需要更多:
up1start
up1stop
up1stop
up1stop
DDD 的领导者将应用层视为事务管理的适当位置。例如,来自文斯·沃恩:
应用程序服务驻留在应用程序层。[...]。他们可以控制持久性事务[...]”。
这是否不会将基础设施问题泄漏到应用程序层中,因为持久性(更具体地说,其实现细节)不是应用程序层应该意识到的事情?
虽然我可以在应用程序层中定义一个契约来满足基础设施层的具体要求,但这仍然感觉有点像泄漏实现细节。虽然这确实实现了与实际持久性具体的解耦,但我认为它并不会使应用程序层真正忽略持久性实现细节。这难道不是我应该关心的事情吗?
下面是一个伪 PHP 的示例,展示了它的外观:
namespace Acme\Application\Contracts;
// A contract in the Application Layer to be satisfied by an infrastructure implementation
interface TransactionManager {
public function begin() : void;
public function commit() : void;
public function rollBack() : void;
}
namespace Acme\Intrastructure\PDO;
class PDOTransactionManager implements TransactionManager {
private PDO $pdo;
public function begin() : void {
$this->pdo->beginTransaction();
}
// ...
}
namespace Acme\Application\Modules\Ordering;
// A context agnostic application service
final …
Run Code Online (Sandbox Code Playgroud) architecture design-patterns domain-driven-design onion-architecture
extjs ×4
extjs4 ×2
ios ×2
iphone ×2
javascript ×2
architecture ×1
associations ×1
cfnetwork ×1
cocoa-touch ×1
extjs-mvc ×1
extjs4.1 ×1
nested ×1
nsstream ×1
orm ×1
performance ×1
posix ×1
uibutton ×1