Meteor.ui #1에 이어 두번째 시간입니다. 이번에는 Meteor.ui 를 더 구조적으로 표현할 수 있도록 도와주는 API에 대해서 살펴보겠습니다.

파일위치는 /usr/local/meteor/packages/liveui/liveui.js 이며, ui 코어소스는 고급기술들이 많으니 살펴보시면 도움이 안되지는 않을거에요.
Meteor.ui.render 기능으로 충분히 사용할 수 있으나, Backbone.js 에서 각 row 를 표현하는 것을 1개의 view 로 작성하듯이, Meteor.ui.render 의 html_func 인자 부분을 더 조각(chunk)내어 구조적으로 표현할 수 있습니다. 이 구조적이란 표현은 Backbone.js 사용하신 분들은 더 이해가 빠르실 듯 하네요. 그리고, 이것은 아래 설명한 Meteor.ui.listChunk의 일부분입니다.
Meteor.ui.chunk(html_func, [options])
Arguments
HTML 을 반환하는 컨트롤 함수 입니다.
전시간에서 설명했듯이 event handler 를 설정할 수 있습니다. meteor eventmap을 확인하세요. Backbone.js의 view 부분도 동일합니다.
//
// 2개의 chunk 를 사용하였고,
// return 되는 값은 문자열 이므로 + 기호로 붙일 수 있습니다.
// Meteor.ui.render 의 결과값인 DocumentFragment 타입을 appendChild 으로
// 바로 화면에 표시합니다.
//
document.body.appendChild(
Meteor.ui.render(function() {
return "<div>" +
Meteor.ui.chunk(function() { return Session.get("greeting"); }) +
" " +
Meteor.ui.chunk(function() { return Session.get("target"); }) +
"</div>";
}));
굉장히 중요한 API입니다. Meteor.ui.render는 한셋트의 html_func를 사용하여 이벤트를 설정할 수 있는데, 이것은 databaes query를 모니터링하고, 리턴되는 cursor의 갯수만큼 Meteor.ui.chunk를 표현할 수 있으며, 값이 변화될때마다 자동으로 Meteor.ui.render 으로 전달됩니다. 이벤트도 Meteor.ui.chunk별로 설정이 가능하다는 것!
Meteor.ui.listChunk(observable, doc_func, [else_func], [options])
Arguments
Mongodb는 Query를 하면 리턴값의 형태를 Cursor 라고 표현합니다. 일반적으로 Resource 라고 이해하시면 됩니다.
데이타가 존재할 시 각각의 데이타를 컨트롤 할 수 있는 함수입니다.
사용하지 않아도 되고, 데이타가 없을 시 컨트롤 할 수 있는 함수입니다.
전시간에서 설명했듯이 event handler 를 설정할 수 있습니다. meteor eventmap을 확인하세요. Backbone.js의 view 부분도 동일합니다.
아래 예제는 Posts collection에서 tags 필드에 frontpage 단어를 검색하여 <div>~</div> 구문에 표현하고, 각각의 div에 클릭이벤트를 부여하여 Session 값을 세팅 한후, 재클릭했을 때, selected 라는 className을 부여하는 내용입니다.
Session.set("selected", null);
var frag = Meteor.ui.render(function() {
return Meteor.ui.listChunk(Posts.find({tags: "frontpage"}),
//
// Posts.find 갯수만큼 callback 이 실행됩니다.
//
function(post) {
var style = Session.equals("selected", post._id) ? "selected" : "";
return '<div class="' + style + '">' + post.name + '</div>';
},
//
// 이벤트 설정
//
{ events:
{
//
// 보통 형태가 eventName className 이었는데,
// className 을 생략하고 전체에 이벤트를 설정합니다.
//
'click': function (event) {
Session.set("selected", this._id);
}
}
});
});
document.body.appendChild(frag);
이것으로 Meteor.ui 의 API대해서 알아보았습니다. 실제 다이나믹하게 html element를 생성하여 화면에 표시하고 제거하는 작업들을 대부분 경험하셨을텐데, 왜 굳이 이런 함수들을 써야 하는지에 대한 이유는 바로 reactivity 때문입니다. 그럼 다음 시간에 뵙겠습니다. 감사합니다.