SlideShare a Scribd company logo
1 of 12
Page 1
예제로 맛보는 Backbone 연습
by 이은숙
Page 2
Backbone 으로 게시판 목록 조회 , 글 등록 , 수정 ,
삭제를 구현하기
* UI 는 부트스트랩을 사용
Page 3
Model
var Board = Backbone.Model.extend({
urlRoot: '/board', // restful api url
validate: function(attrs, options) { // 등록하는 데이터 유효성 검증은 여기서
var errorList = [];
if (attrs.writer== '') {
errorList.push({ name : 'writer', msg :" 작성자를 입력하세요 ."});
}
if (attrs.title == '') {
errorList.push({ name : 'title', msg :" 제목을 입력하세요 ."});
}
if (attrs.contents == '') {
errorList.push({ name : 'contents', msg :" 내용을 입력하세요 ."});
}
if (errorList.length > 0) {
return errorList;
}
},
parse: function(response) { // 조회한 데이터 중 데이터 변환은 여기서
response.insertDateTime = new Date(response.insertDateTime).format("Y-m-d");
return response;
}
});
Page 4
Collection
var BoardList = Backbone.Collection.extend({
model: Board, // 모델 객체
url: '/board', // restful api url
parse: function(response) {
return response;
}
});
Page 5
View - One
var BoardView = Backbone.View.extend({
initialize: function(){
// 모델에 이벤트 연결
this.model.on('change', this.render, this);
this.model.on('destroy', this.remove, this);
},
// 화면에 뿌려질 태그명 , 클래스명 설정
tagName: "li",
className: "list-group-item",
// 태그내에 뿌려진 템플릿 작성
template: _.template('<p><strong><%=title%></strong></p><span><%=writer%> | <%=insertDateTime%></span>'),
render: function(){
// 렌더링시 해당 템플릿에 데이터와 매핑하여 화면에 뿌려준다 .
this.$el.html(this.template(this.model.attributes));
this.$el.data('id', this.model.get('id'));
return this;
},
remove: function(){
console.log(this.$el);
this.$el.remove();
}
});
Page 6
View - List
var BoardListView = Backbone.View.extend({
initialize: function(){
// 모델에 이벤트 연결
this.collection.on('add', this.addOne, this);
this.collection.on('reset', this.addAll, this);
},
events: {
// click 과 같은 사용자 액션에 이벤트 연결
'click .list-group-item p strong' : 'renderModifiyView'
},
// 화면에 뿌려질 태그명 , 클래스명 설정
tagName: 'ul',
className: "list-group",
render: function() {
this.addAll();
return this;
},
// 한건이 등록되었을 경우 등록된 데이터를 랜더링하여 화면에 보여진다 .
addOne: function(board){
var boardView = new BoardView({model: board});
boardView.render();
this.$el.append(boardView.el);
},
// 전체 목록을 보여줄 경우 forEach 를 통해 addOne 을 호출하여 화면에 보여진다 .
addAll: function() {
this.collection.forEach(this.addOne, this);
$('#board-list tbody').remove();
$('#board-list').append(this.el); },
});
Page 7
View – List( 계속 )
// 수정페이지를 수정하려는 데이터를 가져와서 템플릿에 매핑하여 보여진다 ..
renderModifiyView: function(e){
var id = $(e.target).parent().parent().data('id');
var board = new Board({id : id});
board.fetch({success:function(model){
$("#updateBoardView").remove();
$("#boardAppView").append(_.template( $("#updateBoardViewTemplate").html(), model.attributes ));
$("#updateBoardView").data('id', model.get('id'));
$("#updateBoardView").modal({backdrop: false});
}});
}
Page 8
View – Main
var BoardAppView = Backbone.View.extend({
// click 과 같은 사용자 액션에 이벤트 연결
events: {
'click #create' : 'create',
'click #createBoardView .modal-footer button[name=save]' : 'save',
'click #createBoardView .modal-footer button[name=close]' : 'close',
'click #createBoardView .close' : 'close',
'keypress #boardInsertForm input, textarea' : 'clear',
'click #updateBoardView .modal-footer button[name=update]' : 'update',
'click .modal-footer button[name=delete]' : 'delete',
'click #updateBoardView .modal-footer button[name=close]' : 'close',
'click #updateBoardView .close' : 'close',
'keypress #boardInsertForm input, textarea' : 'clear'
},
// 부트스트랩 modal 이용하여 등록창 팝업으로 띄우기
create : function(){
$('#createBoardView').modal({backdrop: false});
},
Page 9
View – Main( 계속 )
// 등록 요청시 해당 콜렉션의 create 를 호출하여 등록한다 . 내부적으로 create 를 호출할 시 add 를 호출하며
(6 페이지에서 this.collection.on('add', this.addOne, this); -> 이미 이벤트로 연결되어 있어 화면은 자동으로
변경 되여 보여진다 .)
save : function(e){
e.preventDefault();
var baord = new Board({ writer : $('#boardInsertForm').find('input[name=writer]').val(),
title : $('#boardInsertForm').find('input[name=title]').val(),
contents : $('#boardInsertForm').find('textarea[name=contents]').val()});
// 유효성 검증
if (!baord.isValid()) {
baord.validationError.forEach(function(element){
$('#boardInsertForm').find('*[name=' + element.name + ']').attr('placeholder',
element.msg).parent().parent().addClass('has-error');
});
} else {
this.collection.create(baord, {wait:true});
this.close(e);
}
},
// 등록 팝업창 닫을 때 화면에 있는 데이터 초기화
close : function(e){
$('#' + $(e.target).parent().siblings('.modal-body').find('form').attr('id')).each(function(){
$(this).find('*[name]').each(function(){
$(this).val('');
if($(this).parent().parent().hasClass('has-error')) {
$(this).attr('placeholder', '').parent().parent().removeClass('has-error');
}
}) ;
});
console.log( $('#'+ $(e.target).parent().parent().parent().parent().attr('id')));
$('#'+ $(e.target).parent().parent().parent().parent().attr('id')).modal('hide');
Page 10
View – Main( 계속 )
// 데이터 초기화
clear : function(e){
var me = $(e.target);
if(me.parent().parent().hasClass('has-error')) {
me.attr('placeholder', '').parent().parent().removeClass('has-error');
}
},
// 수정 요청시 해당 모델의 save 를 호출하여 수정한다 . ( 내부적으로 save 를 호출할 시 change 를 호출하며
5 페이지에서 this.model.on('change', this.render, this); -> 이미 이벤트로 연결되어 있어 화면은 자동으로
변경 되여 보여진다 .)
update : function(e){
e.preventDefault();
var boardList = this.collection.where({ id : $("#updateBoardView").data('id')});
var me = this;
boardList.forEach(function(model){
model.set({ writer : $('#boardUpdateForm').find('input[name=writer]').val(),
title : $('#boardUpdateForm').find('input[name=title]').val(),
contents : $('#boardUpdateForm').find('textarea[name=contents]').val()});
if (!model.isValid()) {
model.validationError.forEach(function(element){
$('#boardUpdateForm').find('*[name=' + element.name + ']').attr('placeholder',
element.msg).parent().parent().addClass('has-error');
});
} else {
model.save();
me.close(e);
}
});
},
Page 11
View – Main( 계속 )
// 삭제 요청시 해당 모델의 destory 를 호출하여 삭제한다 .
(5 페이지에서 this.model.on('destroy', this.remove, this); -> 이미 이벤트로 연결되어 있어 화면은 자동으로
변경
되여 보여진다 .)
delete :function(e){
var boardList = this.collection.where({ id : $("#updateBoardView").data('id')});
boardList.forEach(function(model){
model.destroy();
});
this.close(e);
}
});
Page 12
예제 샘플은 요기 아래에 ~
https://github.com/eunsuklee/board_sample

More Related Content

What's hot

제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기sang doc Lee
 
Web vulnerability seminar4
Web vulnerability seminar4Web vulnerability seminar4
Web vulnerability seminar4Sakuya Izayoi
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.updateHoyoung Jung
 
[JavaScript Library] - Simple jQuery
[JavaScript Library] - Simple jQuery[JavaScript Library] - Simple jQuery
[JavaScript Library] - Simple jQuery문학청년
 
Php faker 를 활용한 의미있는 테스트 데이타 생성
Php faker 를 활용한 의미있는 테스트 데이타 생성Php faker 를 활용한 의미있는 테스트 데이타 생성
Php faker 를 활용한 의미있는 테스트 데이타 생성KwangSeob Jeong
 
Web vulnerability seminar3
Web vulnerability seminar3Web vulnerability seminar3
Web vulnerability seminar3Sakuya Izayoi
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device accessJinKyoungHeo
 
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기Kwangyoun Jung
 

What's hot (14)

Nest js 101
Nest js 101Nest js 101
Nest js 101
 
Mymysql basic sql
Mymysql basic sqlMymysql basic sql
Mymysql basic sql
 
MySQL JOIN
MySQL JOINMySQL JOIN
MySQL JOIN
 
제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기
 
Web vulnerability seminar4
Web vulnerability seminar4Web vulnerability seminar4
Web vulnerability seminar4
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.update
 
[JavaScript Library] - Simple jQuery
[JavaScript Library] - Simple jQuery[JavaScript Library] - Simple jQuery
[JavaScript Library] - Simple jQuery
 
Vue.js 입문 02 템플릿 문법
Vue.js 입문 02 템플릿 문법Vue.js 입문 02 템플릿 문법
Vue.js 입문 02 템플릿 문법
 
3. collection
3. collection3. collection
3. collection
 
Php faker 를 활용한 의미있는 테스트 데이타 생성
Php faker 를 활용한 의미있는 테스트 데이타 생성Php faker 를 활용한 의미있는 테스트 데이타 생성
Php faker 를 활용한 의미있는 테스트 데이타 생성
 
Web vulnerability seminar3
Web vulnerability seminar3Web vulnerability seminar3
Web vulnerability seminar3
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device access
 
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
QnA Blog Using Django - 회원가임/로그인폼, Post, 글보기
 
Hacosa j query 8th
Hacosa j query 8thHacosa j query 8th
Hacosa j query 8th
 

Viewers also liked

[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기Gyutae Jo
 
자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.js자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.jsJinKwon Lee
 
Backbone.js
Backbone.jsBackbone.js
Backbone.jsVO Tho
 
Javascript framework and backbone
Javascript framework and backboneJavascript framework and backbone
Javascript framework and backboneDaniel Lv
 
JavaScript 프레임워크 살펴보기
JavaScript 프레임워크 살펴보기JavaScript 프레임워크 살펴보기
JavaScript 프레임워크 살펴보기항희 이
 
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template EngineOhgyun Ahn
 
Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기JinKwon Lee
 
위플래닛 발표자료 Meteor_js
위플래닛 발표자료 Meteor_js위플래닛 발표자료 Meteor_js
위플래닛 발표자료 Meteor_jsWebFrameworks
 
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)JinKwon Lee
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁WebFrameworks
 
프론트엔드로 시작하는 웹 개발 방법과 지식들
프론트엔드로 시작하는 웹 개발 방법과 지식들프론트엔드로 시작하는 웹 개발 방법과 지식들
프론트엔드로 시작하는 웹 개발 방법과 지식들Eun Cho
 
서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음nexusz99
 
톰캣 운영 노하우
톰캣 운영 노하우톰캣 운영 노하우
톰캣 운영 노하우jieunsys
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작Taegon Kim
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기JinKwon Lee
 
Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications  Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications Juliana Lucena
 
HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트
HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트
HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트Jun Ho Lee
 

Viewers also liked (20)

[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기
 
자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.js자바스크립트의 또다른 발전, Backbone.js
자바스크립트의 또다른 발전, Backbone.js
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
Javascript framework and backbone
Javascript framework and backboneJavascript framework and backbone
Javascript framework and backbone
 
JavaScript 프레임워크 살펴보기
JavaScript 프레임워크 살펴보기JavaScript 프레임워크 살펴보기
JavaScript 프레임워크 살펴보기
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
JavaSript Template Engine
JavaSript Template EngineJavaSript Template Engine
JavaSript Template Engine
 
Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기
 
위플래닛 발표자료 Meteor_js
위플래닛 발표자료 Meteor_js위플래닛 발표자료 Meteor_js
위플래닛 발표자료 Meteor_js
 
Matreshka.js
Matreshka.jsMatreshka.js
Matreshka.js
 
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁
 
프론트엔드로 시작하는 웹 개발 방법과 지식들
프론트엔드로 시작하는 웹 개발 방법과 지식들프론트엔드로 시작하는 웹 개발 방법과 지식들
프론트엔드로 시작하는 웹 개발 방법과 지식들
 
서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음
 
톰캣 운영 노하우
톰캣 운영 노하우톰캣 운영 노하우
톰캣 운영 노하우
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications  Ember.js - A JavaScript framework for creating ambitious web applications
Ember.js - A JavaScript framework for creating ambitious web applications
 
HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트
HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트
HTML5 관점에서 본 2015년 웹개발 트렌드 및 인사이트
 

Similar to 예제로 맛보는 Backbone 연습

처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4성일 한
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기영우 박
 
보험케어.pptx
보험케어.pptx보험케어.pptx
보험케어.pptxjaeheon1
 
Html5&css 3장
Html5&css 3장Html5&css 3장
Html5&css 3장홍준 김
 
Webframeworks angular js 세미나
Webframeworks angular js 세미나Webframeworks angular js 세미나
Webframeworks angular js 세미나WebFrameworks
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개beom kyun choi
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]WSConf.
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기Jeado Ko
 
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화Jinhwa Ko
 
현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)
현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)
현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)Ukjae Jeong
 

Similar to 예제로 맛보는 Backbone 연습 (20)

처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4
 
Xe hack
Xe hackXe hack
Xe hack
 
Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기Django admin site 커스텀하여 적극적으로 활용하기
Django admin site 커스텀하여 적극적으로 활용하기
 
보험케어.pptx
보험케어.pptx보험케어.pptx
보험케어.pptx
 
Html5&css 3장
Html5&css 3장Html5&css 3장
Html5&css 3장
 
Webframeworks angular js 세미나
Webframeworks angular js 세미나Webframeworks angular js 세미나
Webframeworks angular js 세미나
 
Hacosa j query 11th
Hacosa j query 11thHacosa j query 11th
Hacosa j query 11th
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
테스트
테스트테스트
테스트
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 
Redux
ReduxRedux
Redux
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼 #4] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
 
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
[XECon+PHPFest 2014] jQuery 개발자에서 AngularJS 개발자 되기
 
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
XE 레이아웃 제작 실무 노하우 1 - XECon2014 by 고진화
 
Nodejs express
Nodejs expressNodejs express
Nodejs express
 
Hacosa j query 10th
Hacosa j query 10thHacosa j query 10th
Hacosa j query 10th
 
현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)
현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)
현대고등학교 PHP 강의 - 7,8차시 (설리번 프로젝트)
 

예제로 맛보는 Backbone 연습

  • 1. Page 1 예제로 맛보는 Backbone 연습 by 이은숙
  • 2. Page 2 Backbone 으로 게시판 목록 조회 , 글 등록 , 수정 , 삭제를 구현하기 * UI 는 부트스트랩을 사용
  • 3. Page 3 Model var Board = Backbone.Model.extend({ urlRoot: '/board', // restful api url validate: function(attrs, options) { // 등록하는 데이터 유효성 검증은 여기서 var errorList = []; if (attrs.writer== '') { errorList.push({ name : 'writer', msg :" 작성자를 입력하세요 ."}); } if (attrs.title == '') { errorList.push({ name : 'title', msg :" 제목을 입력하세요 ."}); } if (attrs.contents == '') { errorList.push({ name : 'contents', msg :" 내용을 입력하세요 ."}); } if (errorList.length > 0) { return errorList; } }, parse: function(response) { // 조회한 데이터 중 데이터 변환은 여기서 response.insertDateTime = new Date(response.insertDateTime).format("Y-m-d"); return response; } });
  • 4. Page 4 Collection var BoardList = Backbone.Collection.extend({ model: Board, // 모델 객체 url: '/board', // restful api url parse: function(response) { return response; } });
  • 5. Page 5 View - One var BoardView = Backbone.View.extend({ initialize: function(){ // 모델에 이벤트 연결 this.model.on('change', this.render, this); this.model.on('destroy', this.remove, this); }, // 화면에 뿌려질 태그명 , 클래스명 설정 tagName: "li", className: "list-group-item", // 태그내에 뿌려진 템플릿 작성 template: _.template('<p><strong><%=title%></strong></p><span><%=writer%> | <%=insertDateTime%></span>'), render: function(){ // 렌더링시 해당 템플릿에 데이터와 매핑하여 화면에 뿌려준다 . this.$el.html(this.template(this.model.attributes)); this.$el.data('id', this.model.get('id')); return this; }, remove: function(){ console.log(this.$el); this.$el.remove(); } });
  • 6. Page 6 View - List var BoardListView = Backbone.View.extend({ initialize: function(){ // 모델에 이벤트 연결 this.collection.on('add', this.addOne, this); this.collection.on('reset', this.addAll, this); }, events: { // click 과 같은 사용자 액션에 이벤트 연결 'click .list-group-item p strong' : 'renderModifiyView' }, // 화면에 뿌려질 태그명 , 클래스명 설정 tagName: 'ul', className: "list-group", render: function() { this.addAll(); return this; }, // 한건이 등록되었을 경우 등록된 데이터를 랜더링하여 화면에 보여진다 . addOne: function(board){ var boardView = new BoardView({model: board}); boardView.render(); this.$el.append(boardView.el); }, // 전체 목록을 보여줄 경우 forEach 를 통해 addOne 을 호출하여 화면에 보여진다 . addAll: function() { this.collection.forEach(this.addOne, this); $('#board-list tbody').remove(); $('#board-list').append(this.el); }, });
  • 7. Page 7 View – List( 계속 ) // 수정페이지를 수정하려는 데이터를 가져와서 템플릿에 매핑하여 보여진다 .. renderModifiyView: function(e){ var id = $(e.target).parent().parent().data('id'); var board = new Board({id : id}); board.fetch({success:function(model){ $("#updateBoardView").remove(); $("#boardAppView").append(_.template( $("#updateBoardViewTemplate").html(), model.attributes )); $("#updateBoardView").data('id', model.get('id')); $("#updateBoardView").modal({backdrop: false}); }}); }
  • 8. Page 8 View – Main var BoardAppView = Backbone.View.extend({ // click 과 같은 사용자 액션에 이벤트 연결 events: { 'click #create' : 'create', 'click #createBoardView .modal-footer button[name=save]' : 'save', 'click #createBoardView .modal-footer button[name=close]' : 'close', 'click #createBoardView .close' : 'close', 'keypress #boardInsertForm input, textarea' : 'clear', 'click #updateBoardView .modal-footer button[name=update]' : 'update', 'click .modal-footer button[name=delete]' : 'delete', 'click #updateBoardView .modal-footer button[name=close]' : 'close', 'click #updateBoardView .close' : 'close', 'keypress #boardInsertForm input, textarea' : 'clear' }, // 부트스트랩 modal 이용하여 등록창 팝업으로 띄우기 create : function(){ $('#createBoardView').modal({backdrop: false}); },
  • 9. Page 9 View – Main( 계속 ) // 등록 요청시 해당 콜렉션의 create 를 호출하여 등록한다 . 내부적으로 create 를 호출할 시 add 를 호출하며 (6 페이지에서 this.collection.on('add', this.addOne, this); -> 이미 이벤트로 연결되어 있어 화면은 자동으로 변경 되여 보여진다 .) save : function(e){ e.preventDefault(); var baord = new Board({ writer : $('#boardInsertForm').find('input[name=writer]').val(), title : $('#boardInsertForm').find('input[name=title]').val(), contents : $('#boardInsertForm').find('textarea[name=contents]').val()}); // 유효성 검증 if (!baord.isValid()) { baord.validationError.forEach(function(element){ $('#boardInsertForm').find('*[name=' + element.name + ']').attr('placeholder', element.msg).parent().parent().addClass('has-error'); }); } else { this.collection.create(baord, {wait:true}); this.close(e); } }, // 등록 팝업창 닫을 때 화면에 있는 데이터 초기화 close : function(e){ $('#' + $(e.target).parent().siblings('.modal-body').find('form').attr('id')).each(function(){ $(this).find('*[name]').each(function(){ $(this).val(''); if($(this).parent().parent().hasClass('has-error')) { $(this).attr('placeholder', '').parent().parent().removeClass('has-error'); } }) ; }); console.log( $('#'+ $(e.target).parent().parent().parent().parent().attr('id'))); $('#'+ $(e.target).parent().parent().parent().parent().attr('id')).modal('hide');
  • 10. Page 10 View – Main( 계속 ) // 데이터 초기화 clear : function(e){ var me = $(e.target); if(me.parent().parent().hasClass('has-error')) { me.attr('placeholder', '').parent().parent().removeClass('has-error'); } }, // 수정 요청시 해당 모델의 save 를 호출하여 수정한다 . ( 내부적으로 save 를 호출할 시 change 를 호출하며 5 페이지에서 this.model.on('change', this.render, this); -> 이미 이벤트로 연결되어 있어 화면은 자동으로 변경 되여 보여진다 .) update : function(e){ e.preventDefault(); var boardList = this.collection.where({ id : $("#updateBoardView").data('id')}); var me = this; boardList.forEach(function(model){ model.set({ writer : $('#boardUpdateForm').find('input[name=writer]').val(), title : $('#boardUpdateForm').find('input[name=title]').val(), contents : $('#boardUpdateForm').find('textarea[name=contents]').val()}); if (!model.isValid()) { model.validationError.forEach(function(element){ $('#boardUpdateForm').find('*[name=' + element.name + ']').attr('placeholder', element.msg).parent().parent().addClass('has-error'); }); } else { model.save(); me.close(e); } }); },
  • 11. Page 11 View – Main( 계속 ) // 삭제 요청시 해당 모델의 destory 를 호출하여 삭제한다 . (5 페이지에서 this.model.on('destroy', this.remove, this); -> 이미 이벤트로 연결되어 있어 화면은 자동으로 변경 되여 보여진다 .) delete :function(e){ var boardList = this.collection.where({ id : $("#updateBoardView").data('id')}); boardList.forEach(function(model){ model.destroy(); }); this.close(e); } });
  • 12. Page 12 예제 샘플은 요기 아래에 ~ https://github.com/eunsuklee/board_sample