기본 콘텐츠로 건너뛰기

knockout.js 연습.

쉬운거부터 단계적으로 해보자.

http://jsbin.com/ajuxil/edit#javascript,html,live

html 은 이렇고

아이참 SyntaxHighlighter 왤케 안이쁘고 불편하지.

javascript 쪽은
ko.applyBindings({
    userid: '00114FEA0',
    userName: 'Tarzan',
    deptName: 'Jungle'
});
손으로 직접쳐보면 이해가 빠르다.

이게 기본이다.
Binding 하는 부분을 ViewModel로 분리하자.

http://jsbin.com/ajuxil/2/edit
var ViewModel = {
    userid: '00114FEA0',
    userName: 'Tarzan',
    deptName: 'Jungle'
};
ko.applyBindings(ViewModel);
조금 더 나은가?

정말 바인딩이 되었는지 확인해보자.
http://jsbin.com/ajuxil/3/edit
var ViewModel = {
    userid: '00114FEA0',
    userName: 'Tarzan',
    deptName: 'Jungle'
};
ko.applyBindings(ViewModel);

ViewModel.userName = 'Jane';

안된다.

물론 다시 applyBindings를 하면 적용이 된다.
이정도로 만족한다면 말리지 않겠다.
http://jsbin.com/ajuxil/4/edit
var ViewModel = {
    userid: '00114FEA0',
    userName: 'Tarzan',
    deptName: 'Jungle'
};
ko.applyBindings(ViewModel);

ViewModel.userName = 'Jane';
ko.applyBindings(ViewModel);
다음으로 넘어가자.
해당 Model을 관찰하고 있다가 변경이 되면 적용이 되도록 function형태로 View Model을 만들어보자.

http://jsbin.com/ajuxil/5/edit
var ViewModel = function(){
    this.userid = 'Jane';
    this.userName = 'Tarzan';
    this.deptName = 'Woohooo';
};
ko.applyBindings(new ViewModel());
너무 세세한가? 바보 취급 당하고 있다고 생각하지 말고 쳐보자.
직접 Object 를 만드는 것과 차이가 있다. 왜냐면 new ViewModel() 을 콘솔에서 해보면

new ViewModel()

ViewModel
  1. deptName: "Woohooo"
  2. userName: "Tarzan"
  3. userid: "Jane"
  4. __proto__: Object

이런 식으로 나오기 때문이다.
이 차이에 대한 자세한 설명은 생략한다.
Doug Crockford: JavaScript: The Good Parts 를 읽어보든가.
얇고 싼 좋은 책이니까 사라! 읽어라! 두번 읽어라!

수정 가능한 value 로 만들어서 실제 바인딩이 되는지 보자.
http://jsbin.com/ajuxil/7/edit
사실 ViewModel을 여러군데서 쓸게 아니라서 그냥 object 형태로 다시 돌아갔다.
html 도 추가하고
var ViewModel = {
  userid : ko.observable('00114FEA0'),
  userName : ko.observable('Tarzan'),
  deptName : ko.observable('Woohooo')
};
ko.applyBindings(ViewModel);
값에 ko.observable을 줬다.
실제로 텍스트박스 안의 내용을 변경해보면 리스트도 같이 변경되는 것을 볼 수 있다.

그럼 코드안에서 해당 뷰모델을 수정하려면?

ViewModel.userName('Jane');
이런 식으로 해당 ViewModel의 property를 function 처럼 사용해 변경하면 된다.

복수개의 항목을 다룰땐 어떨까?
http://jsbin.com/ajuxil/8/edit
먼저 뷰모델을 수정해보자.
var ViewModel = {
  dept:[
    {
      userid : ko.observable('00114FEA0'),
      userName : ko.observable('Tarzan'),
      deptName : ko.observable('Woohooo')
    },
    {
      userid : ko.observable('03AC99CA0'),
      userName : ko.observable('Jane'),
      deptName : ko.observable('Noooooo')
    }
    
  ]
};
ko.applyBindings(ViewModel);
html에선 간단하게 ul 에 foreach 를 달기만 하면 된다.
  

쿨하네. 멋지군.
복수개라고 해도 별반 다를 건 없다.

ViewModel.dept[1].userName('Kate');
이런 식으로 변경을 할 경우 바로 적용되는 것을 볼 수 있다.

디자이너(요즘은 퍼블리셔라고도 하나?)와 협업하여 작업할때 이상한 메타태그가 들어있으면 프로그래머에게 뷰를 전부 책임지게 하곤 하는데.
이제까진 어쩔 수 없었다. 하지만 MVVM(Model-View-ViewModel)은 다르다.
서로 안망가진 화면을 보면서 작업할 수 있다. 물론 예외상황이 없진 않겠지만.
그리고 프로그래머 입장에서도 뷰와 모델간의 분리를 통해 소스(자바스크립트)안에 지저분하게 DOM을 만지작거리는 작업으로부터 벗어날 수 있다.
개인적으로 서버사이드에서 CSS 셀렉터로 html 을 수정하여 렌더링하는 템플릿 방식을 만들어서 쓰곤 했었는데 물론 이 방식은 javascript 가 안되는 환경에서도 쓸 수 있다던가 검색엔진으로부터 인덱싱이 된다던가 하는 장점이 있지만 클라이언트에서도 어짜피 REST API를 ajax호출하는 방식으로 얼마든지 데이터를 갱신할 수 있기 때문에 knockout.js 의 강력한 데이터 바인딩을 누려보는 것도 좋은 선택이 될 수 있겠다.

댓글

  1. computed : http://jsbin.com/ajuxil/10/edit
    subscribe : http://jsbin.com/ajuxil/11/edit

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

세상 간단한 https(+secured websocket): Caddy

nginx, apache2 같은 걸로 매번 certbot 연동을 통해 https 하는게 지겨워서 알아보니 Caddy라는게 있더라. 설치법은 강하게 크기 위해 알아서 해본다. # cat /etc/caddy/Caddyfile your.shitty.site:8123 {   proxy / localhost:9123 {     websocket     transparent   } } 이건 외부에서 8123으로 들어오는 걸 내부적으로 9123로 맞춰서 https 맞춰주는 reverse proxy. 만일 port를 생략하면 # cat /etc/caddy/Caddyfile your.shitty.site {   proxy / localhost:9123 {     websocket     transparent   } } 기본포트인 443으로 되어 https://your.shitty.site 로 접속이 된다. 요새 말썽이던 cloudflare 버리고 netlify domain이랑 caddy를 쓰니까 앓던 이가 빠진 느낌. 이 조합은 당분간 계속 써야겠다 싶다.

LG G Pro 2 Custom Rom +Rooting 기록

선 루팅 https://forum.xda-developers.com/lg-g3/general/guide-root-lg-firmwares-kitkat-lollipop-t3056951 1.2버전 스크립트 모드로. echo Looking for LG serial port.. echo. adb.exe wait-for-device 여기에서 정체 상태여서 강제로 adb kill-server 했더니 알아서 재부팅하심. 폰에선 "펌웨어 업데이트"화면이 나오고 Phone found at COM5! Rooting phone.. If you don't see the SuperSu installer script runs within about a minute, then the root failed. Author : blog.lvu.kr SPECIAL COMMAND : ENTER, LEAVE ## 이런 상황이 됨. #이 느린 속도로 하나씩 증가하고 있음. 한 시간 기다려도 성과없음. 뭐 몇번해봐도 안되고 결국 불안하긴 하지만 kingroot.net  로 설치 롤리팝이니까  https://drive.google.com/file/d/0B4kfGU1z_PClQ3AyM2lKOGR1S3M/view  이걸 받아서 압축 풀기. d838recovery.bat 만 있어서 당황스럽긴한데 실행하고 1번 하니까 리커버리 모드 진입까진 잘 되는 듯. adb sideload 라는게 있어서 해봄. Advance에서 adb sideload 선택하고 USB연결한 PC에서 adb sideload RR-N-v5.8.5-20171010-d838-Final.zip 하니까 착착 잘 진행됨. 이제 흉측한 U+LTE 가 없어짐. ㅇㅋ 군더더기 없고 깔끔한데 남은 건 gapps 를 설치해야함. http://opengapps.org/  를 권해줘서 갔는데 지옥 느림. ARM + 7.1 + stock 이 기본이...