Showing posts with label 앵귤러js. Show all posts
Showing posts with label 앵귤러js. Show all posts

Thursday, May 12, 2016

AngularJS 부트스트랩(bootstrap) 모달(Modal) 창 예제

Modal


제가 작업하고 있는 프로젝트가
아니고 또 AngularJS를 사용하지 않는다고
해도 아래와 같은 모달창은 웹 페이지 작업
에서 많이 사용이 됩니다. 일회성 정보나
설정 값 입력 등의 작업을 화면에서 할 때
현재 화면에 이동이나 큰 변화 없이
별도의 창을 하나 띄워 그 창에서 작업을
완료하면 다시 창을 닫는 형태의 작업에서
이 Modal 창을 참 유용하죠~


AngularJS에서 모달창을 띄울 때
bootstrap 모듈을 이용해서 띄우고
있는데 모달창을 띄워야 되는 페이지의
html 파일에서 아래와 같이 모달 페이지에
해당하는 html의 경로를 ng-include를
이용해서 아래와 같이 입력합니다.


그리고 위에 경로를 입력해준
html의 컨트롤러에서 아래와 같이
해당 모달 창을 띄워 줍니다.


주석으로 처리되어 있는 이유는 위에
방법을 사용하지 않기 때문입니다.
이유는 지금부터 설명하겠습니다.

Modal로 파라미터 보내기


프로젝트를 해오면서 지금까지는 모달창에
보이는 내용은 모달 자체의 controller에서
처리한 값이나 박힌 값들로 구성이 되어
있었습니다. 그런데 이번에는 모달창을
호출했던 페이지에서 특정 값을 모달창으로
넘겨야 하는 경우가 생겼습니다.

일단 위에서 사용한 ng-include는 동일하게
사용합니다. 그리고 모달창을 띄우기 위한
태그에 angularjs에서 제공하는 ng-click으로
아래와 같이 search()라는 함수를
호출하게 했습니다.


위에 상황을 대략 설명 드리자면
컨트롤러에 있는 search 함수를
호출해서 모달창을 띄우려고 하는데
이 모달창으로 특정 값을 보내고
싶은데 그 값이 vm.page + $index
이 값입니다. 단순 정수 값인데
이 값을 알아야 모달창에 작업을
진행할 수 있습니다. 그리고 GET_SOURCE
값은 컨트롤러에서 분기를 위한 값입니다.
아래의 코드를 보시면 이해가 되실 겁니다.


if문에서 condition 값이 GET_SOURCE 인 경우
즉 지금 제가 하고 있는 작업이 저 else if 문에서
실행되는 겁니다. 안에 내용도 설명을 드리겠습니다.
내용은 두 줄이 전부입니다.
첫 번째 라이은 제가 필요로 하던 값(param)을
모달 창의 특정 태그에 set 하는 부분이고,
두 번째 라인은 그 modal창을 띄우는 부분입니다.

첫 번째 라인은 form-group이라는 값을
클래스로 갖는 태그에서 result_index라는
name 값을 가지는 태그에 param 변수에
담긴 값을 set 하라는 내용입니다.
모달 창에서 위에 값이 set 되는 부분은
아래와 같습니다.


그래서 결과는 아래와 같이 나왔습니다.


정말 간단한 숫자 값 하나이지만
저 하나를 얻기 위해 엄청난 시간을
허비했습니다. 몰라서...
방법을 가르켜준 다나양에게
다시 한 번 감사의 인사를...
꾸벅~

Thursday, May 5, 2016

[앵귤러JS] 플로우차트(워크플로우) 동적으로 생성하는 AngularJS 예제 소스

FlowChart(WorkFlow)


회사 내부 프로젝트 중 BPMN이라는
것에 UI적인 표현을 위해 워크플로우
라는 것을 이용하려고 하고 있습니다.
워크플로우(WorkFlow) 라는 용어는
저희 회사 내부적으로만 사용하는
용어로 대략적으로 특정 비즈니스나 작업의 
흐름을 표준화된 형태로 파일로 기록하면
그 것을 기반으로 UI 적으로 표현을
해주는 기능을 의미하고 있습니다.
그리고 동적으로 추가/삭제/수정이
화면에서 수행되어야 합니다.
그러다가 연휴 전 날에 하나 재미있는
예제를 찾았습니다. 실행한 예제는
아래와 같습니다. 아! 예제는 카페에
올려 놓았습니다~~!



대략적으로 설명을 해보겠습니다.
일단 오른쪽에 차트가 그려져 있고,
차트 위에 네 개의 버튼이 있습니다.
그리고 왼쪽에는 뭔가 단어들이
나열되어 있는데 JSON 형태로
작성된 내용입니다.

일단 차트에는 두 개의 노드가 존재하고
있습니다. 이 때 Node1은 A,B,C 라는
Input과 A,B,C라는 아웃풋이 존재하고,
Node2 역시 A,B,C라는 인풋과 아웃풋이
존재합니다. 
(Input, output, node 명은 수정이 가능합니다)
그리고 Node1의 B라는 output이 Node2의
C라는 Input으로 연결되어 있습니다.

위에 내용과 같은 형식으로 표현될 수 있는
작업(Work)이나 비즈니스(business)가
실무에서 존재할 것이며, 위와 같이 길게
말로 설명할 수도 있겠지만 한 눈에
볼 수 있는 즉 가독성이 좋은 형태는
역시 UI 적으로 보여주는 겁니다.
그래서 위에 긴 내용이 그림으로 표현된 것이
오른쪽에 차트 형식으로 그려진 겁니다.


그리고 오른쪽 상단에 버튼 네 개 중
Add Node 라는 버튼을 누르면
위와 같이 새로운 노드를 추가할 수
있고 확인 버튼을 누르면 어플의
재시작 없이 바로 아래처럼
웹 브라우저에 새로운 노트가 추가되며,
마우스 드래그를 통해 원하는 위치로
이동도 가능합니다.


그리고 Add Input Connector,
Add Output Connector 버튼을
통해 아래 이미지처럼 원하는 노드의
input, output 값도 수정이 가능합니다.


input(왼쪽)에 원래 X, Y, Z 라는 
인풋만 존재했는데 1이라는 인풋을
추가해 준 모습니다.


그리고 화면에서 추가된 사항은
바로바로 위와 같이 왼쪽의
JSON에 반영이 됩니다~


생성된 Node3의 3 output을
기존에 존재하던 Node2의
C Output으로 연결해 주었습니다.
실제에서는 output에서 다른 노드의
output으로 가는 케이스가 많을까?
라는 의심이 들지만 단순 예제이니
그냥 넘어가도록 하겠습니다~
여기서 중요한 건 화면에서 동적으로
이러한 내용들을 실시간으로
표현해주고 반영이 바로 된다는
사실이니깐요~
위와 같이 화면에서 적용을 하면
당연히 왼쪽의 JSON에도 반영이
되어야 하겠지요~!?


위에 내용이 JSON 내용 중 노드 간
연결 정보를 표현하고 있는 부분입니다.
출발지(source) 정보와 도착지(dest)
라는 각각의 key에 node명과 connection라는
value를 가지고 있습니다.

AngularJS에서 통신을 하거나 어떤 
값/상태를 표시할 때 JSON을
사용하는데 잘 알지 못할 때는
음.. 뭐 이런 것도 있나보구나 하고
넘어갔었는데 AngularJS에서 자주
사용하다 보니 참 괜찮은 놈이구나란
생각이 듭니다~

이 녀석을 있는 그대로 사용할 순 없고,
좀 더 프로젝트에 맞게 다듬어야 하겠지만
정말 이런 예제가 있다라는 것만으로도
엄청난 시간을 절약한 셈입니다.
AngularJS 짱~ㅎㅎㅎㅎ

AngularJS2.0 사용 위한 환경 설정 및 프로젝트 생성

타입스크립트 설치
npm installl -g typescript

인텔리J 설정



angularjs2.0 프로젝트를 생성하기 위해서는
아래의 방법대로 직접 파일을 생성해주거나


github에 있는 angularjs2.0 프로젝트를
다운 받아서 사용해야 되는 거 같다.


app디렉토리, index.html,
package.json, tsconfig.json,
typings.json 모두 직접 생성



app 디렉토리 밑에도 위와 같이
app.component.js, main.js 직접 생성

npm install 한 후

npm start 하면 화면 뜬다

Saturday, April 23, 2016

[AngularJS] input,selectbox 유효성 검사하는 form 태그 관련 예제(앵귤러JS ngMessages 모듈 사용)

회원가입 유효성


기존 작업하고 있던 프로젝트 중에 아래처럼
회원이 입력한 input의 값 유무, 길이, 값의 형태,
selectbox의 선택 여부 등을 체크하는
부분이 있었습니다. 
아 관련 예제는 pdReport 카페에 올려 놓았습니다!



AngularJS 소스라 아주 조금 다른 부분이
있지만 알아보는데는 전혀 지장이 없을
겁니다~ 어쨌든 위에 HTML 소스를 보시면
회원가입 시 입력한 정보의 유효성을 체크하는
부분인 것을 알 수 있습니다. 값이 있나 없나,
특정 값이 선택되었는지의 여부, 그리고
정규식을 이용해 유효한 이메일이 입력되었는지
등을 체크하는 if 문의 향연입니다ㅠㅠㅠㅠ


참고로 회원정보를 입력받는 화면은
위와 같습니다. Input, 셀렉트박스가
있으며, 모든 값들이 반드시 선택/입력
되어야 하는 필수 값들입니다.
그래서 입력하지 않으면 Required!라는
글자가 오른쪽에 표시 됩니다.

위에 해당하는 웹 페이지 소스 부분을
AngularJS에서 제공해주는 ngMessages
모듈을 이용해서 싹 수정해 봤습니다.
개인적으로 jQuery나 javascript를 사용해
보지 않고, 바로 앵귤러JS를 사용하는 거라
AngularJS로  구현하는 것이 자바스크립트/jQuery를
이용하는 것보다 더 좋다 나쁘다를 단정해서
말할 수는 없지만 어쨌든 개인적인 입장에서
AngularJS로 수정을 함으로써 전보다는
코드의 양이 많이 줄어서 뿌듯합니다.

위에서도 말씀드렸 듯이 앵귤러JS의
ngMessages라는 모듈을 이용해서
쉽게 구현할 수 있었습니다.

이메일 부분의 유효성 확인하는 소스
부분을 올려 봤습니다.


일단 form 태그 안에 <div> 태그가 몇 개 있는데
그 중에 name="username" 인 input 태그를
보시면 AngularJS 문법이 몇 개 나옵니다.
대략적으로 설명을 해보겠습니다.

ng-pattern


ng-pattern 이라는 속성이 있는데
그 값으로 정규식 하나가 들어가
있습니다. 바로 이메일 정규식입니다.
input 태그에 사용자가 입력한 이메일이
이메일 형태가 맞는지를 확인하기 위해
정규식을 이용하는 건데 AngularJS에서
해당 input의 숙성값에 바로 정규식을
입력할 수 있도록 제공해 주고 있습니다.

ng-required = 'true'


input 태그 안에 ng-required의 값이
true로 할당되어 있습니다.
이 부분에 의미는 input에 어떤 값이든
무조건 입력해야 되는 걸 의미합니다.
즉 필수값에 해당하는 경우 각 입력태그에
위와 같인 값을 주면 되는 겁니다.
근데 문제는 이 값만 준다고 되는게 아니고
ng-required='true' 값을 준 입력태그에
값이 입력되지 않았다면 화면에 입력되지
않았다는 경고창이나 메시지를 띄워
줘야겠죠~ 이런 알림 메시지까지
AngularJS에서 자동으로 해주진
않습니다 ㅎㅎㅎㅎㅎㅎㅎㅎㅎ

그럼 어떻게 해줘야 될까요?

다시 위에 소스를 보시면
아래와 같은 부분이 있습니다.


일단 소스를 보면 당연히 값이
유효하지 않다는 메시지를
띄워주는 부분이구나 란 것을
알 수 있습니다.
이메일이 입력되지 않았으면
Required! 를 띄워주고,
이메일 형태가 아니면
Invalid Email! 이라고
화면에 출력해 주는 거지요...

그런데 문제는 어떻게 위에 부분이
호출되는 건지가 중요하겠죠..
일단 알림 메시지에 해당하는
span 태그 두개를 감싸고 있는
<div>가 존재하는데 div 태그에
ng-messages 라는 속성의 값이

'login_form.username.$error'

라고 하네요.... 뭘까요?ㅋㅋㅋ
일단 ng-messages 의 할당 된 값
login_form.username.$error
에서 login_form은 저 위에 세번째
캡처사진에 있는 form의 name 값이고,
username은 login_form 하위에 있는
name='username' 인 input 태그를
의미합니다. 그리고 그 input태그 하위에
$error 이라는 값을 보고 있는데
이 값은 AngularJS에서 보내주는 값으로
name='username' 인 input 태그에
error 정보를 보내줍니다. 근데 무조건
모든 태그의 error 정보를 보내주느게
아니고, input 태그에 입력한 
ng-required, ng-pattern 값을 줬기 때문에
$error이라는 정보를 AngularJS에서
받을 수 있는 겁니다.

그러므로 input 태그에 아무런 값을
입력하지 않으면 $error 정보에 required 값이
false로 떨어져서 받아볼 수 있고, 이 값이
false 일 때 Required! 라는 메시지가
화면에 뜨게 되는 겁니다.

그리고 만약 정확한 이메일의 값을
입력하지 않으면 $error에 pattern 값이
false로 오기 때문에(정규식 비교) 
Invalid Email이라는 메시지가
화면에 출력됩니다.

아 이 때 ng-show 라는 속성이 있는데
이 또한 앵귤러JS에서 제공해주는 것으로
ng-show='true' 이면 해당 태그가 화면에서
보이고 false이면 화면에서 보이지 않습니다!


이메일 형태에 맞게 입력하니
오른쪽에 있는 Required! 라는
메시지가 사라진 걸 보실 수 있습니다~

이번에 교육받은 내용을 실제 작업 중인
프로젝트에 적용하면서 알게 된 내용들을
두서 없이 작성한 거라 AngularJS를 처음
접하시는 분들은 이해하기 어려울 거라
생각됩니다. 간단한 예제를 카페에 올려
놓았으니 한 번 참고해 보시기 바랍니다.

Thursday, April 21, 2016

[AngularJS] 앵귤러JS 프로그래밍 교육내용 및 예제 정리 - 커스텀필터(Custom Filter)

FILTER


AngularJS의 Controller 안에 $scope.변수명
형태로 선언데 변수들은 View 단에서 {{변수}} 
형태로 해당 변수 값을 출력할 수 있습니다.
binding 한다고 하더라구요~ 그런데 이 때
{{변수 | 필터명:옵션....}}
이런 형태로 변수명에 특정 필터를 걸어 주어
출력되는 값에 대한 조절이 가능합니다.

{{money | currency : 'won'}}

위와 같이 주면 money 라는 변수에
담긴 값이 화면에 출력될 때 환율표시가
자동으로 됩니다. 기본은 달러 표시이기
때문에 우리나라 화폐 단위인 won 으로
표시해 주기 위해 currency의 옵셥으로
'won' 을 줬습니다.사용하는 필터 뒤에
: 를 붙여줘서 옵셥을 줄 수 있습니다.

{{today | date : 'medium'}}

이런 식으로 날짜/시간 정보도
필터로 줄 수 있는데 저희가 흔히
알고 있는 yyyyMMdd 형태도
제공하고 별도로 AngularJS에서는
아래와 같은 옵션도 제공합니다.

단축형
전체날짜시간 : medium, short

전체날짜 : fullDate, longDate, 
mediumDate,shortDate

전체시각 : mediumTime, shortTime


위에가 실제 예제입니다.
위에 예제를 실행한 결과는
아래와 같습니다.


자바에서 substring과 같이 값을 자르는
기능도 필터로 구현할 수 있습니다.

$scope.val = '12345689';

위와 같이 controller에 값이 선언하고,
view를 아래와 같이 코딩했습니다.

<input type='number' step='1' ng-model='num'><br>
{{val | limitTo:num}}

limitTo 필터가 val의 일부분을 가지고 오는데
0자리에서 옵셥으로 준 num 자리까지의
숫자만 자릅니다.
예를 들면 만약 num=2 라면

{{'123456789' | ㅣlimitTo : 2}}

가 되는 것이므로 결과는 12 가 됩니다.

Custom Filter


지금까지는 AngularJS에서 제공하는
필터를 단순하게 사용한 예제였습니다.
컼스텀 필터는 사용자가 직접 자신이
필요한 filter를 만들어서 위와 같이 사용
하는 데 목적이 있습니다. 똑같이
바인딩 시킬 수 있고, 옵션도 주겠죠~

커스텀 필터 예제 pdReport 카페에서
받으시면 됩니다~



주석 부분이 선명하지 않으니
예제를 다운 받아서 보시길
권해 드립니다... 죄송합니다 ㅠ

대략적으로 설명을 드리면
일단 filter 를 구현할 모듈을 생성했고,
해당 모듈의 이름은 demo입니다.
그리고 그 demo 모듈 안에서
커스텀 필터를 구현했습니다.
아 먼저 이 필터는 어떤 기능을 하는지
설명을 드리자면 위에 소스에서 body를
보시면 중괄호 안에 각각 0, 1, 2 값을
필터를 태우려고 하고 있고, 필터명은
ox입니다. 값이 0이면 결과로 x.
값이 1이면 결과로 o를 출력하는
정말 별 의미 없는 filter인데,
커스텀 필터를 직접 만들어 보는데
의미가 있는 것이므로 어떻게 커스텀필터를
만드는지만 보시면 될 거 같습니다.

demo모듈 안에 filter 구현부를 보시면
제일 처음에 map이 있는데 0이라는 키는
x라는 값을 갖고, 1이라는 키는 o라는
값을 가지고 있습니다.
그리고 이 map을 사용하는 function을
최종적으로 return해주고 있는데
이 function에 파라미터 data가
존재하는데 이 data로는 body에서
중괄호 안에 입력한 0, 1, 2,가
들어오게 됩니다. 그래서 이 값을 보고
filter 안에 function에서 o나 x를
최종적으로 리턴해주게 되고, 그 값이
view에 출력이 되는 겁니다.