KnockoutJS-템플릿

Template반복적으로 사용할 수있는 DOM 요소 집합입니다. 템플릿은 DOM 요소의 중복을 최소화하는 속성으로 인해 복잡한 애플리케이션을 쉽게 구축 할 수 있도록합니다.

템플릿을 만드는 방법에는 두 가지가 있습니다.

  • Native templating−이 방법은 foreach, with, if와 같은 제어 흐름 바인딩을 지원합니다. 이러한 바인딩은 요소에있는 HTML 마크 업을 캡처하고이를 임의 항목의 템플릿으로 사용합니다. 이 템플릿에는 외부 라이브러리가 필요하지 않습니다.

  • String-based templating− KO는 타사 엔진에 연결하여 ViewModel 값을 전달하고 결과 마크 업을 문서에 삽입합니다. 예를 들어 JQuery.tmpl 및 Underscore Engine입니다.

Syntax

template: <parameter-value>

<script type = "text/html" id = "template-name">
   ...
   ...   // DOM elemets to be processed
   ...
</script>

참고 type 제공됩니다 text/html KO에게 알리기 위해 스크립트 블록에서 실행 블록이 아니라 렌더링해야하는 템플릿 블록입니다.

Parameters

다음 속성의 조합은 매개 변수 값으로 템플릿에 보낼 수 있습니다.

  • name − 이것은 템플릿의 이름을 나타냅니다.

  • nodes− 템플릿으로 사용할 DOM 노드의 배열을 나타냅니다. name 매개 변수가 전달되면이 매개 변수는 무시됩니다.

  • data − 이것은 템플릿을 통해 표시되는 데이터 일뿐입니다.

  • if − 주어진 조건이 true 또는 true-like 값이되면 템플릿이 제공됩니다.

  • foreach − foreach 형식으로 템플릿을 제공합니다.

  • as − 이것은 foreach 요소에 별칭을 생성하기위한 것입니다.

  • afterAdd, afterRender, beforeRemove − 이들은 모두 수행되는 작업에 따라 실행되는 호출 가능한 함수를 나타냅니다.

관찰

명명 된 템플릿 렌더링

템플릿은 제어 흐름 바인딩과 함께 사용할 때 DOM 내부의 HTML 마크 업에 의해 암시 적으로 정의됩니다. 그러나 원하는 경우 템플릿을 별도의 요소로 분리 한 다음 이름으로 참조 할 수 있습니다.

Example

<!DOCTYPE html>
   <head>
      <title>KnockoutJS Templating - Named Template</title>
      <script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
         type = "text/javascript"></script>
   </head>

   <body>
      <h2>Friends List</h2>
      Here are the Friends from your contact page:
      <div data-bind = "template: { name: 'friend-template', data: friend1 }"></div>
      <div data-bind = "template: { name: 'friend-template', data: friend2 }"></div>

      <script type = "text/html" id = "friend-template">
         <h3 data-bind = "text: name"></h3>
         <p>Contact Number: <span data-bind = "text: contactNumber"></span></p>
         <p>Email-id: <span data-bind = "text: email"></span></p>
      </script>

      <script type = "text/javascript">
         function MyViewModel() {
            this.friend1 = { 
               name: 'Smith', 
               contactNumber: 4556750345, 
               email: '[email protected]' 
            };
            
            this.friend2 = { 
               name: 'Jack', 
               contactNumber: 6789358001, 
               email: '[email protected]' 
            };
         }

         var vm = new MyViewModel();
         ko.applyBindings(vm);
      </script>
      
   </body>
</html>

Output

위의 코드가 어떻게 작동하는지보기 위해 다음 단계를 수행해 보겠습니다.

  • 위의 코드를 template-named.htm 파일.

  • 브라우저에서이 HTML 파일을 엽니 다.

  • 여기에서는 friend-template이 2 번 사용됩니다.

템플릿에서 "foreach"사용

다음은 사용 예입니다. foreach 템플릿 이름과 함께 매개 변수.

Example

<!DOCTYPE html>
   <head>
      <title>KnockoutJS Templating - foreach used with Template</title>
      <script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
         type = "text/javascript"></script>
   </head>

   <body>
      <h2>Friends List</h2>
      Here are the Friends from your contact page:
      <div data-bind = "template: { name: 'friend-template', foreach: friends }"></div>

      <script type = "text/html" id = "friend-template">
         <h3 data-bind = "text: name"></h3>
         <p>Contact Number: <span data-bind = "text: contactNumber"></span></p>
         <p>Email-id: <span data-bind = "text: email"></span></p>
      </script>

      <script type = "text/javascript">
         function MyViewModel() {
            this.friends = [
               { name: 'Smith', contactNumber: 4556750345, email: '[email protected]' },
               { name: 'Jack', contactNumber: 6789358001, email: '[email protected]' },
               { name: 'Lisa', contactNumber: 4567893131, email: '[email protected]' }
            ]
         }

         var vm = new MyViewModel();
         ko.applyBindings(vm);
      </script>
      
   </body>
</html>

Output

위의 코드가 어떻게 작동하는지보기 위해 다음 단계를 수행해 보겠습니다.

  • 위의 코드를 template-foreach.htm 파일.

  • 브라우저에서이 HTML 파일을 엽니 다.

  • 여기서 foreach 컨트롤은 템플릿 바인딩에 사용됩니다.

foreach 항목에 대한 키워드로 사용하여 별칭 만들기

다음은 foreach 항목에 대해 별칭을 만드는 방법입니다.

<div data-bind = "template: { 
   name: 'friend-template', 
   foreach: friends, 
   as: 'frnz' 
}"></div>

별칭을 만들어 foreach 루프 내부에서 부모 개체를 쉽게 참조 할 수 있습니다. 이 기능은 코드가 복잡하고 여러 수준에서 중첩 될 때 유용합니다.

Example

<!DOCTYPE html>
   <head>
      <title>KnockoutJS Templating - using alias in Template</title>
      <script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
         type = "text/javascript"></script>
   </head>

   <body>
      <h2>Friends List</h2>
      Here are the Friends from your contact page:
      <ul data-bind = "template: { 
         name: 'friend-template', 
         foreach: friends, 
         as: 'frnz' 
      }"></ul>

      <script type = "text/html" id = "friend-template">
         <li>
            <h3 data-bind = "text: name"></h3>
            <span>Contact Numbers</span>
            <ul data-bind = "template: { 
               name : 'contacts-template', 
               foreach:contactNumber, 
               as: 'cont'
            } "></ul>
            <p>Email-id: <span data-bind = "text: email"></span></p>
         </li>
      </script>

      <script type = "text/html" id = "contacts-template">
         <li>
            <p><span data-bind = "text: cont"></span></p>
         </li>
      </script>

      <script type = "text/javascript">
         function MyViewModel() {
            this.friends = ko.observableArray ( [
               { 
                  name: 'Smith', 
                  contactNumber: [ 4556750345, 4356787934 ], 
                  email: '[email protected]' 
               },
               
               { 
                  name: 'Jack', 
                  contactNumber: [ 6789358001, 3456895445 ], 
                  email: '[email protected]' 
               },
               
               { 
                  name: 'Lisa', 
                  contactNumber: [ 4567893131, 9876456783, 1349873445 ],  
                  email: '[email protected]' 
               }
            ]);
         }

         var vm = new MyViewModel();
         ko.applyBindings(vm);
      </script>
      
   </body>
</html>

Output

위의 코드가 어떻게 작동하는지보기 위해 다음 단계를 수행해 보겠습니다.

  • 위의 코드를 template-as-alias.htm 파일.

  • 브라우저에서이 HTML 파일을 엽니 다.

  • 배열의 전체 이름 대신 별칭이 사용됩니다.

afterAdd, beforeRemove 및 afterRender 사용

템플릿에 의해 생성 된 DOM 요소에서 추가 사용자 정의 로직을 실행해야하는 상황이 있습니다. 이 경우 다음 콜백을 사용할 수 있습니다. 다음 foreach 요소를 사용하고 있다고 생각하십시오-

afterAdd −이 함수는 foreach에서 언급 한 배열에 새 항목이 추가 될 때 호출됩니다.

beforeRemove −이 함수는 foreach에 언급 된 배열에서 항목을 제거하기 직전에 호출됩니다.

afterRender − 여기에 언급 된 함수는 foreach가 렌더링 될 때마다 호출되고 배열에 새 항목이 추가됩니다.

Example

<!DOCTYPE html>
   <head>
      <title>KnockoutJS Templating - Use of afterRender Template</title>
      <script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
         type = "text/javascript"></script>
      <script src = "https://code.jquery.com/jquery-2.1.3.min.js"
         type = "text/javascript"></script>
   </head>

   <body>
      <h2>Friends List</h2>
      Here are the Friends from your contact page:
      <div data-bind = "template: { 
         name: 'friend-template', 
         foreach: friends , 
         afterRender: afterProcess
      }"></div>

      <script type = "text/html" id = "friend-template">
         <h3 data-bind = "text: name"></h3>
         <p>Contact Number: <span data-bind = "text: contactNumber"></span></p>
         <p>Email-id: <span data-bind = "text: email"></span></p>
         <button data-bind = "click: $root.removeContact">remove </button>
      </script>

      <script type = "text/javascript">
         function MyViewModel() {
            self = this;
            this.friends = ko.observableArray ([
               { name: 'Smith', contactNumber: 4556750345, email: '[email protected]' },
               { name: 'Jack', contactNumber: 6789358001, email: '[email protected]' },
            ])

            this.afterProcess = function(elements, data){
               $(elements).css({color: 'magenta' });
            }

            self.removeContact = function() {
               self.friends.remove(this);
            }
         }

         var vm = new MyViewModel();
         ko.applyBindings(vm);
      </script>
   </body>
</html>

Output

위의 코드가 어떻게 작동하는지보기 위해 다음 단계를 수행해 보겠습니다.

  • 위의 코드를 template-afterrender.htm 파일.

  • 브라우저에서이 HTML 파일을 엽니 다.

  • 여기서는 foreach가 렌더링 될 때마다 afterProcess 함수가 실행됩니다.

동적으로 템플릿 선택

사용할 수있는 템플릿이 여러 개인 경우 이름을 다음과 같이 만들어 동적으로 하나를 선택할 수 있습니다. observable매개 변수. 따라서 이름 매개 변수가 변경되면 템플릿 값이 재평가되고 데이터가 다시 렌더링됩니다.

Example

<!DOCTYPE html>
   <head>
      <title>KnockoutJS Templating - Dynamic Template</title>
      <script src = "https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"
         type = "text/javascript"></script>
   </head>
   
   <body>
      <h2>Friends List</h2>
      Here are the Friends from your contact page:
      <div data-bind = "template: { 
         name: whichTemplate, 
         foreach: friends 
      }"></div>

      <script type = "text/html" id = "only-phon">
         <h3 data-bind = "text: name"></h3>
         <p>Contact Number: <span data-bind = "text: contactNumber"></span></p>
      </script>

      <script type = "text/html" id = "only-email">
         <h3 data-bind = "text: name"></h3>
         <p>Email-id: <span data-bind = "text: email"></span></p>
      </script>

      <script type = "text/javascript">
         function MyViewModel() {
   
            this.friends = ko.observableArray ([
               {
                  name: 'Smith', 
                  contactNumber: 4556750345, 
                  email: '[email protected]', 
                  active: ko.observable(true)
               },
               
               {
                  name: 'Jack', 
                  contactNumber: 6789358001, 
                  email: '[email protected]', 
                  active: ko.observable(false)
               },
            ]);

            this.whichTemplate = function(friends) {
               return friends.active() ? "only-phon" : "only-email";
            }
         }

         var vm = new MyViewModel();
         ko.applyBindings(vm);
      </script>
      
   </body>
</html>

Output

위의 코드가 어떻게 작동하는지보기 위해 다음 단계를 수행해 보겠습니다.

  • 위의 코드를 template-dynamic.htm 파일.

  • 브라우저에서이 HTML 파일을 엽니 다.

  • 사용할 템플릿은 활성 플래그 값에 따라 결정됩니다.

외부 문자열 기반 엔진 사용

기본 템플릿은 중첩 된 코드 블록이 있어도 다양한 제어 흐름 요소와 완벽하게 작동합니다. KO는 또한 Underscore templating Engine 또는 JQuery.tmpl과 같은 외부 템플릿 라이브러리와 통합하는 방법을 제공합니다.

공식 사이트에서 언급했듯이 JQuery.tmpl은 2011 년 12 월 이후로 더 이상 개발 중이 아닙니다. 따라서 KO의 기본 템플릿은 JQuery.tmpl 또는 기타 문자열 기반 템플릿 엔진 대신에만 권장됩니다.

이에 대한 자세한 내용 은 공식 사이트 를 참조하십시오.