2012年8月17日星期五

关于sencha touch 2的app,控制器和视图加载。

关于sencha touch 2的app,控制器和视图加载。

玩了两天ST2,搞明白了那MVC模式,就是不明白如何像后端一样随心所欲的使用控制器和视图。

applaction和viewport一样都是单例模式,一样应用中只有一个,简称app。

如果不在app里定义view,那么就不用建立那个app文件夹及view文件夹和文件,可以在lunch里定义并创建一个视图,你可以用viewport去add,也可以定义把视图定义为fullscreen这样不用viewport去add也可以出来。

如果只是不想建立那多么多空文件夹,那就自己把view和controller加载上,app发现已经定义过了,就不会去加载。

那个app的文件夹名也可以换成自己的,用appFolder配置。

不想定义controller,就在veiw里定义listener,只是对浏览器的路由用什么来支持。

最后还是要写controller只是自己想办法加载controller类,不让app去加载。

如果在app里定义views和controllers,发现系统启动,那些类定义文件就一起加载了,这不是我想要的,我想自己加载,自己实例化。view好说,直接用Ext.create实例化了,controller的实例化得加一个参数:application:this,这个结论是查看源码时得到的。自己在lunch里实例化controller,发现contor里定义的部分能用,routers的定义就不支持,跟踪了一个下午发现在dispatch那里出问题了。

原来所有的controller里定义的routers和refs及contol最终都要挂载到app成,成为app的属性,controller本身也会当属性挂载上,只是这是个特殊属性,挂载后,还要通过instantiateControllers把controller实例化后后用名字做过索引,做为app的私有属性ControllerInstances挂载到app上,当一个action作为参数被dispatch时,app会检查action的controller实例是不是继承自ext.app.contoller或者放在app的ControllerInstances中。如果只是实例化一下,没有放到app的私有属性ControllerInstances里,dispatch执行时就会断掉。

我的办法是在先用setControllers把controller放到app的controllers属性里,再调用app的私有方法instantiateControllers去实例化, 这样一来,就失去了原本的意义。


TAG: