만져본지 얼마 안되어서 ExtJS에 대해서 많은 걸 말하기는 그렇지만 예전에 받았던 느낌대로 ExtJS가 제공해주는대로 사용한다면 아주 쉽게 Rich한 UI를 만들어 낼 수 있지만 그 이상 뭔가 하려면 꽤나 고생이 필요할 듯 하다는 인상은 여전히 가지고 있습니다. 버전이 그사이 많이 올라가서 따끈따끈한 3.1을 쓰고 있지만 마치 ASP.NET을 쓰는듯한 느낌입니다. JSON형태로 설정 옵션에 셋팅을 쭉해주고 바인드해버리면 UI에 척!하고 달라붙어버리고 쉽게 핸들링하는.... 머 ExtJS를 소개하려고 하는건 아니니까요....
Json데이터를 Ajax로 불러오는 JsonStore가 있습니다. 간단한 예제는 Advanced DataView Example를 보시면 됩니다. JsonStore에 프로퍼티로 url프로퍼티가 있고 url프로프티를 이용해서 Ajax로 JSON데이터를 요청할 URL을 적어주면 됩니다. 위 Example의 소스를 참고하면 아래의 형태가 됩니다.
this.store = new Ext.data.JsonStore({
url: 'get-images.php',
root: 'images',
fields: [
'name', 'url',
{name:'size', type: 'float'},
{name:'lastmod', type:'date', dateFormat:'timestamp'}
],
listeners: {
'load': {fn:function(){ this.view.select(0); }, scope:this, single:true}
}
});
this.store.load();
파라미터를 설정하는 프로퍼티는 따로 있긴 하지만 저는 url자체를 변경해야하는 이슈가 있었습니다. 일반적인 JS를 다루는 습관처럼 간단히 접근했습니다.
console.log(this.store.url); // get-images.php
this.store.url = "/test.html";
console.log(this.store.url); // /test.html
this.store.load(); // it's request to GET http://127.0.0.1:8000/examples/view/get-images.php?_dc=1261648849285
그냥 간단히 store.url의 값을 바꿔주려고 한거였는데 값은 정상적으로 바뀐 것을 확인할 수 있었지만 정작 요청을 날리기 위해서 store.load()를 하면 기존에 셋팅되어 있던 URL로 요청이 발생했습니다. 실제 Requet를 날릴때는 store.url이 아닌 다른 곳에 저장된 곳에 있는 URL이 요청이 발생하는 듯 합니다.
JSonStore의 Config Option url부분을 보면 아래와 같이 나와있습니다.
If a proxy is not specified the url will be used to implicitly configure a HttpProxy if an url is specified. Typically this option, or the data option will be specified.
Config Option의 proxy로 명확한 HttpProxy의 url 대신 쓰인다는 듯 합니다.
this.store = new Ext.data.JsonStore({
proxy: new Ext.data.HttpProxy({
url: 'get-images.php',
method: 'POST',
})
})
실제로는 위처럼 proxy로 HttpProxy를 지정해 주어야 하는데 특별히 지정하지 않고 store.url로 설정을 간소화 할 수 있습니다. 실제로 Request가 날라가는 주소는 store.proxy.url이기 때문에 store.url을 바꾸어도 실제 요청에는 영향을 끼치지 못하는 것입니다. HttpProxy에는 setUrl()이라는 메서드가 존재하기 때문에 이 메서드를 이용해서 URL을 변경해 줄 수 있습니다. (관련해서 찾다보니 이런식으로 사용해야 하는 것이 3.x버전부터인듯 합니다.)
this.store.proxy.setUrl("/test.html");
this.store.load();
위와같이 사용하면 됩니다. 솔직히 url이라는 HttpProxy로 자동으로 설정해주는(내부 구조는 정확히 모르지만) conrig Option을 만들어 놓고 set을 할 수 없다는 것은 잘 이해가 가지 않고 거기에 this.store.proxy.setUrl이라는 좀 긴 체인으로 된 호출이 나오게 되는건 아쉽네요.(제가 모르는건지...)
this.store = new Ext.data.JsonStore({
setUrl: function(newUrl) {
this.proxy.setUrl(newUrl);
}
})
this.store.setUrl("/test.html");
this.store.load();
this.store.proxy.setUrl처럼 길게 쓰는게 실다면 store 내부에 위처럼 proxy.setUrl을 호출하는 메서드를 추가하여 사용할 수도 있습니다. 어느쪽이 좋은지는 머 각자 선택하는 것이겠죠.
스토어의 역활이 Data를 저장하는거기 때문에 특정 장소에서 data를 가져오는 부분은 proxy에게 위임을 하였기 때문에 복잡해진거 같아요.. ^^
아직 ExtJS가 클래스를 구성하는 방식이나 의도등을 잘 몰라서 해매고 있네 그냥 봤을때는 당연히 SetUrl이 있을줄 알았는데. ㅋ