1부에서 Veiw와 JSONView에 대해 간략하게 소개했습니다. 오늘은 잭의 이미지 선택기(Jack's Image Chooser)는 원래 잭의 트릭이 많이 포함되어 있는 아주 좋은 사례였지만, 이 때문에 다 이해할 수는 없습니다. "큰 줄기와 깊은 줄기"만 선택할 수 있습니다. 공유해 보시기 바랍니다!
이 글에는 4가지 주요 지식 포인트가 포함되어 있습니다: 1. LayoutDialog에 탭 추가하기 2. 보기 사용 방법 3. JSONView 사용 방법 4. XML/JSON 필드 값 얻기
【뷰 정의】
뷰는 일반적으로 더 복잡한 그리드를 구축하는 대신 데이터 모델의 빠른 템플릿 기반 표시를 구축하는 데 사용되는 것으로 생각됩니다. 템플릿은 반복적인 HTML 생성에 사용할 수 있으며 반드시 데이터 모델에 연결될 필요는 없습니다.
주요 의미는 View가 DataModel 데이터를 표시하는 데 사용된다는 것입니다. 이미 패스라고 말했어요. 다음은 fourm의 누군가가 제공하는 보충제입니다.
코드 주석:
1. 먼저 간단한 문단을 읽어보세요
//用yui.ext做翻转按钮, super easy(美工最爱!?^^) showBtn = getEl('showIntro'); showBtn.on('click', this.showDialog, this, true); showBtn.applyStyles("cursor:pointer"); showBtn.on('mouseover', function(){showBtn.dom.src='images/over_10.gif'}, this, true); showBtn.on('mouseout', function(){showBtn.dom.src='images/btn_10.gif'}, this, true);
//左边动画效果,createDelegate()负责轮换效果 var luo=getEl("left_pic"); luo.move('right', 250, true, .1, function(){ luo.dom.src='images/'+who+".gif"; luo.move('left', 250, true, .15, null, YAHOO.util.Easing.easeOutStrong); }.createDelegate(this));
2. LayoutDialog에 탭 추가
LayoutDialong은 서쪽과 중앙의 두 영역으로 나뉩니다. 중앙에는 탭을 추가하고 활성 이벤트를 하나씩 첨부해야 합니다
var center = layout.getRegion('center'); var tab1 = new YAHOO.ext.ContentPanel('luo', {title: '罗老师作品'}); center.add(tab1); center.add(new YAHOO.ext.ContentPanel('chen', {title: '陈老师作品'})); <br> //center.on('panelactivated',function(){ // alert(center.titleTextEl); //}, this, true); //center.showPanel('center'); /*two ways to activate the tabs.and tabs= many CPs 如果在BasicDialog中,只需要dialog本身就可以获取getTabs,因为Dialog本身就是 唯一的一个Region; 但在LayoutDialog中,Region是多个的,所有要指明哪个一个Region才行 */ <br> // stoe a refeence to the tabs 获取TABS集合 var tabs = layout.getRegion('center').getTabs();//逐一加入事件 tabs.getTab('center').on('activate', function(){this.show_thumb('student')}, this, true); tabs.getTab('luo').on('activate', function(){this.show_thumb('luo')}, this, true); tabs.getTab('chen').on('activate',function(){this.show_thumb('chen')}, this, true); //center.showPanel('chen'); //用Region激活也可以 /*Tips:不能立即激活事件,会点延时,经过多行代码的延时便ok !用addbufferlistener理论上也可以*/ layout.getRegion('center').getTabs().activate('center');
3. 보기 사용 방법
//XML:index方式访问字段;JSON:直接使用字段名 var tpl = new YAHOO.ext.Template( '<div class="thumb">'+ '<div><img onclick=popupDialog("userfiles/image/'+who+'/{0}",{2},{3}) '+ ' src=userfiles/image/lite_'+who+'/{0}></div>' + '<div>文件大小: {1}</div>'+ '</div>' ); tpl.compile(); //“编译DOM”加速 var schema = { tagName: 'row',//Item项 id: 'id',//ID如不需要时,设置空白字符串,不能取消! fields: ['filename','filesize','width','height']//读取的字段 }; var dm = new YAHOO.ext.grid.XMLDataModel(schema); var mainView = new YAHOO.ext.View('pic_'+who, tpl, dm, { singleSelect: true,//If JSON,还需指定一个config:jsonRoot emptyText : '<div style="padding:10px;">没有匹配的内容!</div>' }); dm.on('load',function(){}, this, true); mainView.on('click', function(vw, index, node, e){ //alert('Node "' + node[] + '" at index: ' + index + ' was clicked.') },this, true); mainView.prepareData = function(data){ // prepare,用于自定义格式 //如JSON方式直接属性名访问,e.g data.sizeString = formatSize(data.size); data[1] = formatSize(data[1]); return data; }; //用DataModel加载文件,如果是JSONView,这个服务由JSONView本身(UpdateManager)提供 dm.load('xml.asp?who='+who);
4. JSONView 사용 방법
var dh = YAHOO.ext.DomHelper; dh.append(document.body, {tag: 'div', id: 'editUserDialog-user'}); //XML:index方式访问字段;JSON:直接使用字段名 var tpl = new YAHOO.ext.Template('<div>Username: {username}</div>' + '<div>Birthday: {birthday}</div>' + '<div>Member Since: {join_date}</div>' + '<div>Last Login: {last_login}</div>'); tpl.compile(); var mainView = new YAHOO.ext.JsonView('pic', tpl, { singleSelect: true, jsonRoot: 'user', emptyText : '<div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px">No images match the specified filter</div>' }); mainView.load("test.asp", "id=2"); //JSONView特有的异常事件 mainView.on('loadexception', function(){onLoadException()}, this, true); var onLoadException= function(v,o){ alert('Error'); };
5. XML/JSON 필드 값 및 페이지 매기기 가져오기
이 두 가지 문제를 함께 논의하는 이유는 지금까지 그것을 이루지 못했기 때문입니다. jack의 방법을 따르면
mainView.on('click', function(vw, index, node, e){ alert('Node "' + node.id + '" at index: ' + index + ' was clicked.'); });
//在Domhelper中“硬”输出click事件 var tpl = new YAHOO.ext.Template( <br> '<div class="thumb">'+<br> '<div><img onclick=popupDialog("userfiles/image/'+who+'/{0}",{2},{3}) '+<BR> ' src=userfiles/image/lite_'+who+'/{0}></div>' + <br> '<div>文件大小: {1}</div>'+<br> '</div>'<br>);
페이징:
뷰의 페이징은 DataModel을 전달해야 합니다. 그러나 나는 결코 성공하지 못했습니다. 이유를 아시는 분 계시면 알려주세요.
http://www.ajaxjs.com/yuicn/article.asp?id=20070239