使用InjectProxy、InjectMediator简化Fabrication开发
结合前两篇文章:
小试Flex框架Fabrication
Flex多国语言示例
加上Fabrication自身支持的元标签,可简化一些代码,但简化后也付出了一定的代码,那就是变量需要声明为public,而之前虽然繁琐,但却可以将其声明为private。
以InjectProxy标签为例,进行说明,先看之前的实现:
在“小试Flex框架Fabrication”的例子中,使用了AddContactFormProxy这个代理类(用于数据处理),在mediator类(继承自FlexMediator)中声明了_proxy这个变量,然后覆写onRegister方法,在该方法内对变量_proxy进行初始化,方法如下:
_proxy = retrieveProxy(AddContactFormProxy.NAME) as AddContactFormProxy;
调用retrieveProxy方法获取到AddContactFormProxy类的引用,其中AddContactFormProxy.NAME为AddContactFormProxy类中公开的静态常量
public static const NAME:String = “AddContactFormProxy”;//值为类的名称
在org.puremvc.as3.multicore.utilities.fabrication.core包下的FabricationModel类中可看到它的实现:
1: /**
2: * Copyright (C) 2008 Darshan Sawardekar.
3: *
4: * Licensed under the Apache License, Version 2.0 (the "License");
5: * you may not use this file except in compliance with the License.
6: * You may obtain a copy of the License at
7: *
8: * http://www.apache.org/licenses/LICENSE-2.0
9: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License.
15: */
16:
17: package org.puremvc.as3.multicore.utilities.fabrication.core {
18: import org.puremvc.as3.multicore.utilities.fabrication.utils.HashMap;
19: import org.puremvc.as3.multicore.interfaces.IProxy;
20: import org.puremvc.as3.multicore.utilities.fabrication.interfaces.IDisposable;
21: import org.puremvc.as3.multicore.core.Model;
22:
23: /**
24: * FabricationModel is the custom model implementation used internally
25: * by fabrication.
26: *
27: * @author Darshan Sawardekar
28: */
29: public class FabricationModel extends Model implements IDisposable {
30:
31: /**
32: * Creates and returns the instance of the FabricationModel for the specified
33: * multiton key.
34: *
35: * @param multitonKey The multitonkey whose FabricationModel is to be created.
36: */
37: static public function getInstance(multitonKey:String):FabricationModel {
38: if (instanceMap[multitonKey] == null) {
39: instanceMap[multitonKey] = new FabricationModel(multitonKey);
40: }
41:
42: return instanceMap[multitonKey] as FabricationModel;
43: }
44:
45: /**
46: * Stores the proxies in this model in a hash map.
47: */
48: protected var proxyHashMap:HashMap;
49:
50: /**
51: * Creates the FabricationModel instance.
52: *
53: * @param multitonKey The multitonkey for this FabricationModel
54: */
55: public function FabricationModel(multitonKey:String) {
56: super(multitonKey);
57:
58: proxyHashMap = new HashMap();
59: }
60:
61: /**
62: * @see org.puremvc.as3.multicore.interfaces.IModel#registerProxy()
63: */
64: override public function registerProxy(proxy:IProxy):void {
65: proxy.initializeNotifier(multitonKey);
66: proxyHashMap.put(proxy.getProxyName(), proxy);
67: proxy.onRegister();
68: }
69:
70: /**
71: * @see org.puremvc.as3.multicore.interfaces.IProxy#retrieveProxy()
72: */
73: override public function retrieveProxy(proxyName:String):IProxy {
74: return proxyHashMap.find(proxyName) as IProxy;
75: }
76:
77: /**
78: * @see org.puremvc.as3.multicore.interfaces.IModel#hasProxy()
79: */
80: override public function hasProxy(proxyName:String):Boolean {
81: return proxyHashMap.exists(proxyName);
82: }
83:
84: /**
85: * @see org.puremvc.as3.multicore.interfaces.IModel#removeProxy()
86: */
87: override public function removeProxy(proxyName:String):IProxy {
88: var proxy:IProxy = proxyHashMap.remove(proxyName) as IProxy;
89: proxy.onRemove();
90:
91: return proxy;
92: }
93:
94: /**
95: * @see org.puremvc.as3.multicore.utilities.fabrication.interfaces.IDisposable#dispose()
96: */
97: public function dispose():void {
98: proxyHashMap.dispose();
99: proxyHashMap = null;
100:
101: removeModel(multitonKey);
102: }
103: }
104: }
而应用时通过覆写onRegister方法,来初始化:
1: override public function onRegister():void {
2: super.onRegister();
3:
4: _proxy = retrieveProxy(AddContactFormProxy.NAME) as AddContactFormProxy;
5: }
这样之后的处理函数中就可以调用AddContactFormProxy类的方法了,如调用它的add方法:
_proxy.add();//根据方法定义传入对应的参数
而现在换成使用InjectProxy标签,将代码会会精简一些(使用了Ioc注入简化了开发中的代码编写):
1、需要设定编译器的参数:
点击项目,右击选择属性,找到第二项“Flex编译器”,在附加的编译器参数中输入:“-locale zh_CN -keep-as3-metadata=InjectProxy,InjectMediator”
其中我使用了locale 中文语言包进行了处理,具体操作步骤可参考“Flex多国语言示例”(地址见文章最前面)
2、在需要使用的类中,使用如下的写法:
1: [InjectProxy(name="AddContactFormProxy")]
2: public var _proxy:AddContactFormProxy;
这样就完成了对变量_proxy的初始化,后续调用可以不再使用retrieveProxy()方法了,也可以不再去覆写onREgister()方法了。
至于Mediator,则与此类似(InjectMediator),当然也可以实现自定义标签<参数InjectMeditor的实现就好>,主要需要覆写如下方法:
1: protected function addCustomMetaDatas():Array{
2: return [];
3: };
4:
5: protected function addCustomProcessors():Array{
6: return [];
7: };
8:
9: protected function addViewPackages():Array{
10: return [];
11: };
12:
13: protected function addCustomFilterPackage():Array{
14: return [];
15: }
具体参见包org.puremvc.as3.multicore.utilities.fabrication.global中的FabricationConfig类的代码,标签的处理逻辑可以参数包org.puremvc.as3.multicore.utilities.fabrication.injection中的ProxyInjectorProcessor类。(自己实现两个方法:processor、elementExist)
1: package org.puremvc.as3.multicore.utilities.fabrication.interfaces
2: {
3: import org.puremvc.as3.multicore.interfaces.IFacade;
4: import org.puremvc.as3.multicore.utilities.fabrication.injection.InjectionField;
5:
6: public interface IInjectProcessor
7: {
8: function processor(field:InjectionField, facade:IFacade ):Object;
9:
10: function elementExist(field:InjectionField,facade:IFacade = null):IFacade
11: }
12: }
本文例子的 完整代码下载
- iOS“远程越狱”间谍软件Pegasus技术分析
- 学习HTML5之表单
- 基于jQuery的ajax对WebApi和OData的封装我们还是先来看看要求在看看目标:思路封装方式
- js的动态加载、缓存、更新以及复用(四)
- ajax的再次封装!(改进版) —— new与不 new 有啥区别?
- ajax的再次封装!
- 【自然框架】js版的QuickPager分页控件 V2.0
- 你的SQL语句放在了哪里?
- oclhashcat:离线hash密码破解工具官方文档(中文版)
- 如何动态加载js?
- 【自然框架】数据访问之精雕细琢(一)存储过程的参数
- 100w条记录分页,可以有多快?—— DataReader分页与SQL语句分页的对比测试(在线演示)
- Mimikatz小实验:黄金票据+dcsync
- 【自然框架】n级下拉列表框的原理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法