`

mate之Injectors引发的问题

 
阅读更多
   1、背景介绍:系统中含有事件模块,EventListView.mxml为对应的事件列表。其他有引用到事件列表的页面如下:
   “资源管理”模块的主机页面和虚拟机页面;
   ”应用平台“模块对应的事件页面。

   2、我起初在引用模块都是new EventListView();断点调试发现EventListView对应的查询事件的方法getEventsDataPage()总会被多次调用... ... 追踪发现原来mate框架中的Injectors是与对象一一对应的。

   3、新建一个单例类并且在其中初始化EventListView,系统都通过单例类去获得EventLiseView的实例。

  4、新问题:如何在不同分辨率下控制dataGrid中显示的事件数?  
public function eventCountPerDataPage():void{
					if(dataPage.dataPage==null)
					dataPage.dataPage = new DataPage();
					var rowCount:int = dataGrid.rowCount = (dataGrid.height-dataGrid.headerHeight)/dataGrid.rowHeight;
					dataPage.countPerPage = rowCount;
			}

   这种解决方式的确是可以让dataGrid根据页面的大小安排数目适当事件显示。现在的情况是系统中有A/B/C/D四个页面都引用到了事件列表并且每个页面的大小都不相同;这样子上述的方法就出现了问题:我每次切入新页面时事件列表的的高度还都是上一个页面的高度也即dataGrid.height是上一个引用事件列表页面的高度。

   5、事件绑定
   SystemEventView.mxml
private function initEventListView():void{
				eventListView.percentHeight = 100;
				eventListView.percentWidth = 100;
				eventListView.paddingLeft = 0;
				eventListView.paddingRight = 0;
				eventListView.paddingTop = 0;
				eventListView.paddingBottom = 0;
				eventListView.checkBoxPaddingLeft = 15;
				eventListView.lookDetailPaddingLeft = 18;
				eventListView.dgRowHeight = 25;
				eventContainer.addElement(eventListView);
			    this.dispatchEvent(new Event("EventListViewCreated"));
			}
			
			[Bindable(Event="EventListViewCreated")]
			private function queryAllEvents():void{
				if(firstTimeInitializeEventModel==""){
					eventListView._referenceModuleName="";
					eventListView.initEventPage();
				}
			}

    在SystemEventModel中如图所示的方式进行引用:
    

     在model中进行断点调试却出现了图上的错误,说是断点处是不可达的。

   ——换一种方式进行绑定:   
			private function init():void {
				creationCompleteFlag = true;
				ModuleCreationCompleteFlagHelper.getInstance().eventManagementModuleCreationComplete = true;
				this.addEventListener("EventListViewCreated",queryAllEvents);
			}
			
			public function datacenterSwitch(event:DatacenterRemoteEvent):void {
				eventListView.initEventPage();
			}
			
			private function initEventListView():void{
				eventListView.percentHeight = 100;
				eventListView.percentWidth = 100;
				eventListView.paddingLeft = 0;
				eventListView.paddingRight = 0;
				eventListView.paddingTop = 0;
				eventListView.paddingBottom = 0;
				eventListView.checkBoxPaddingLeft = 15;
				eventListView.lookDetailPaddingLeft = 18;
				eventListView.dgRowHeight = 25;
				eventContainer.addElement(eventListView);
			    this.dispatchEvent(new Event("EventListViewCreated"));
			}
			
			//[Bindable(Event="EventListViewCreated")]
			private function queryAllEvents(evt:Event):void{
				if(firstTimeInitializeEventModel==""){
					eventListView._referenceModuleName="";
					eventListView.initEventPage();
				}
			}

    变种:取消对第25行的注释同事注释第4行——queryAllEvents都没有能被调用。

   6、继续想办法解决4... ... 事件绑定得作为专题进行学习。

 
—————— 附: 针对4的补充说明:——————
   mate配置:
   	<Injectors target="{EventListView}" >
		<PropertyInjector targetKey="model" source="{EventListModel}"/>
		<ListenerInjector eventType="{DataPageEvent.EVENT_DATAPAGECOMPONENT_CHANGED}" method="initDataPageComponent"/>
		<ListenerInjector eventType="{EventsDeleteEvent.EVENTS_DELETE_RESULT}" method="deleteEventsResult"/>
		<ListenerInjector eventType="{MarkAsReadedEvent.MARK_AS_READED_RESULT}" method="markedAsReadedResult"/>
		<ListenerInjector eventType="{EventsGetEvent.EVENTS_GET_FROM_TOOLBAR}" method="getEventsDataPageOnClickToolBarInEventModule"/>
	</Injectors>


   考虑到mate中Injectors引发的多次查询动作,我采用了单例模式,如下:
   public static function getEventViewInstance():EventListView{
   if(eventListView==null){
    eventListView = new EventListView();
   }
   return eventListView;
  }


    model为空异常:
	
[Bindable]
public var model:EventListModel;
private function getEventsDataPage(event:MouseEvent,referenceModuleName:String):void {//点击导航中的”事件“或者在其他引用模块查询事件
				if(referenceModuleName==""){//当点击导航中的"事件"进行查询时,清空查询条件
					queryEventCondition.cleanQueryCondition();
				}
				if(event != null && dataPage.dataPage != null) {
					dataPage.dataPage.startPageIndex = 1;
				}
				if(this.currentState == "filter" ) {
					queryEventCondition.level = levelComb.selectedItem.value as String;
					queryEventCondition.statusStr = (readStatus.selectedValue==null) ? null :readStatus.selectedValue.toString();
					queryEventCondition.eventCategory = (eventType.selectedValue==null) ? null : eventType.selectedValue.toString();
					queryEventCondition.startTime = startTime;
					queryEventCondition.endTime = endTime;
				}
				eventCountPerDataPage();
				model.getEvents(queryEventCondition,dataPage.dataPage);
			}

第19行报model为空的异常!!!——为什么?
我的权宜之计是在此处添加了一个定时器,等待一秒之后再执行查询事件的方法此时model已经不为null了。

在此方法中断点调试时发现会生成ResizeEventListView1~4(resize对象的个数与被引用的个数一致); 因为EventListView只会执行一次CreateComplete方法导致只有第一次加载EventListView时通过如下的方法计算出来的RowCount值才是正确的:
  public function eventCountPerDataPage():void{
     if(dataPage.dataPage==null)
     dataPage.dataPage = new DataPage();
     var rowCount:int = dataGrid.rowCount = (dataGrid.height-dataGrid.headerHeight)/dataGrid.rowHeight;
     dataPage.countPerPage = rowCount;
   }
而后面加载EventListView时计算出来的dataGrid.height都是上一次加载的EventListView的dataGrid.height。
  • 大小: 25.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics