Parsley 命令解耦结果处理程序和观察者
Parsley Command Decoupled Result Handlers and Observers
我昨晚发布了一个问题,在阅读后听起来很糟糕,所以我删除了它并回来重试,这次正确。
我有一个使用 Parsley 的 Flex 移动应用程序,一切都按预期工作,但我正在尝试在我的控制器中使用解耦结果处理程序,但它没有在我期望的时候触发,所以想要一个关于原因的指针。
命令如下所示:
public function execute():void
{
var asyncToken:AsyncToken = Db.Instance.ViewChildren(mainModel.loggedInUser.userId);
asyncToken.addResponder(new Responder(result, error));
}
public function result(result:ResultEvent):void
{
callback(result.result);
}
public function error(event:FaultEvent):void
{
callback(event.fault);
}
按预期工作,命令被执行并且结果处理程序处理结果,当我尝试在视图的控制器中放置消息处理程序时出现问题。
[CommandResult]
public function handleResult(result:AsyncToken):void
{
trace("result in the controller");
}
[CommandError]
public function handleError(fault:AsyncToken):void
{
trace('error: ' + fault.fault.faultDetail);
}
当结果到达时,这些侦听器都不会触发,所以我做了显而易见的事情并将代码更改为:
[CommandResult]
public function handleResult():void
{
trace("result in the controller");
}
[CommandError]
public function handleError():void
{
trace('fault in controller);
}
现在它触发了,但我没有数据句柄。
我确实想过将命令执行方法更改为
public function execute():AsyncToken
{
return Db.Instance.ViewChildren(mainModel.loggedInUser.userId);
}
因为它确实 return 一个 AsyncToken,但是命令根本不会触发(它是映射到名为 ChildEvent 的事件的 2 命令序列的一部分,这是第二个和链中的最后一个事件。
所以总而言之,我希望上述方法有效,但希望能够在解耦的结果处理程序中管理结果,但我不知道该怎么做,欧芹手册非常适合达到这一点(http://www.spicefactory.org/parsley/docs/3.0/manual/?page=commands§ion=intro),但更精细的细节有点粗略。
谢谢
通过对 Controller 代码稍作调整,我们最终得到:
[CommandResult(type="view.user.UserEvent", selector="loadUser")]
public function handleResult(result:Object):void
{
trace("this is the command result");
}
或
[CommandResult(selector="loadUser")]
public function handleResult(result:Object, trigger:UserEvent):void
{
trace("this is the command result");
}
现在这会触发,我得到一个包含我的数据的对象,已解决。
请注意 Parsley 3.0 的手册遗漏了解释其实际工作原理的部分。我最终在 Parsley 2.2 手册中找到了它(3.0 手册中的等效部分已被删除!)但是如果你需要它 http://www.spicefactory.org/parsley/docs/2.2/manual/messaging.php#command_methods
谢谢大家!
我昨晚发布了一个问题,在阅读后听起来很糟糕,所以我删除了它并回来重试,这次正确。
我有一个使用 Parsley 的 Flex 移动应用程序,一切都按预期工作,但我正在尝试在我的控制器中使用解耦结果处理程序,但它没有在我期望的时候触发,所以想要一个关于原因的指针。
命令如下所示:
public function execute():void
{
var asyncToken:AsyncToken = Db.Instance.ViewChildren(mainModel.loggedInUser.userId);
asyncToken.addResponder(new Responder(result, error));
}
public function result(result:ResultEvent):void
{
callback(result.result);
}
public function error(event:FaultEvent):void
{
callback(event.fault);
}
按预期工作,命令被执行并且结果处理程序处理结果,当我尝试在视图的控制器中放置消息处理程序时出现问题。
[CommandResult]
public function handleResult(result:AsyncToken):void
{
trace("result in the controller");
}
[CommandError]
public function handleError(fault:AsyncToken):void
{
trace('error: ' + fault.fault.faultDetail);
}
当结果到达时,这些侦听器都不会触发,所以我做了显而易见的事情并将代码更改为:
[CommandResult]
public function handleResult():void
{
trace("result in the controller");
}
[CommandError]
public function handleError():void
{
trace('fault in controller);
}
现在它触发了,但我没有数据句柄。
我确实想过将命令执行方法更改为
public function execute():AsyncToken
{
return Db.Instance.ViewChildren(mainModel.loggedInUser.userId);
}
因为它确实 return 一个 AsyncToken,但是命令根本不会触发(它是映射到名为 ChildEvent 的事件的 2 命令序列的一部分,这是第二个和链中的最后一个事件。
所以总而言之,我希望上述方法有效,但希望能够在解耦的结果处理程序中管理结果,但我不知道该怎么做,欧芹手册非常适合达到这一点(http://www.spicefactory.org/parsley/docs/3.0/manual/?page=commands§ion=intro),但更精细的细节有点粗略。
谢谢
通过对 Controller 代码稍作调整,我们最终得到:
[CommandResult(type="view.user.UserEvent", selector="loadUser")]
public function handleResult(result:Object):void
{
trace("this is the command result");
}
或
[CommandResult(selector="loadUser")]
public function handleResult(result:Object, trigger:UserEvent):void
{
trace("this is the command result");
}
现在这会触发,我得到一个包含我的数据的对象,已解决。
请注意 Parsley 3.0 的手册遗漏了解释其实际工作原理的部分。我最终在 Parsley 2.2 手册中找到了它(3.0 手册中的等效部分已被删除!)但是如果你需要它 http://www.spicefactory.org/parsley/docs/2.2/manual/messaging.php#command_methods
谢谢大家!