기본 콘텐츠로 건너뛰기

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를 쓰니까 앓던 이가 빠진 느낌. 이 조합은 당분간 계속 써야겠다 싶다.

느려터진 안드로이드 에뮬은 버리고 VM을 쓰자.

iOS개발 환경이 안드로이드보다 우월점은 여러가지가 있겠지만 개인적으로 가장 큰부분이라고 생각하는 점이 iOS Simulator 의 넘사벽 속도다. 사실 iOS 의 경우 Emulator 가 아니라 Simulator 라는 훼이크를 써서 그런건데. 하드웨어+소프트웨어를 같이 하는 회사만이 쓸 수 있는 필살기라 볼 수 있다. 반면 안드로이드의 경우 ARM 에뮬레이터를 사용하는데 이게 참 못만들었다. 플스에뮬이나 GBA에뮬 반정도만 만들어도 써줄텐데 아직 갈길이 멀다. 그래서 구시렁 거리면서 하드웨어를 연결해서 테스트를 하고 있는데 역시 USB연결하는 건 불편하고 apk 를 전송하는 과정도 그다지 빠르지 않아서 개발 생산성이 월등히 나아지지는 않는다. 루팅을 하면 wifi 를 통해 apk 를 인스톨 할 수 있다고 해서 몇 가지를 해보았으나 잘 모르겠지만 인스톨까진 잘 되었는데 디버깅 모드로 실행이 되지 않아 그만두었다. 게다가 전송속도도 USB보다 wifi가 느리고 맘에 들지 않더라. 그러던중 stackoverflow.com(늘 신세지고 있습니다) 에서 "VM으로 안드로이드를 띄워서 adb connect 하면 좋아!" 라는 글에 눈이 번쩍. 시행착오를 몇번 했지만 의외로 간단하더라. 1. VMWare건 VirtualBox건 상관없다. VM호스트를 준비하자. 2. http://www.android-x86.org/download 로 가서  Deprecated x86 2.2 generic  을 받자. Q) 왜 Deprecated 인 2.2 generic 을 받나요. Deprecated는 쓰면 안되는 거 아님? A) http://mariuz.android-dev.ro/vm.iso.7z 도 있다고 한다. http://www.android-x86.org/download 에 있는 요즘 것들은 죄다 안된다. 3. 죄다 일단 Default 설정에 yes yes 하고 설치한다. 한글 문서가 필요한 분은 ...

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 이 기본이...