# کامپوننت‌ها در AngularJS 1.5 - قسمت دوم - مسیریابی

در این قسمت به معرفی سیستم مسیریاب در Angular 1.5 خواهیم پرداخت. قبل از معرفی این سیستم ابتدا سیستم مسیریاب اصلی در Angular را بررسی خواهیم کرد. مروری بر مسیریابی در AngularJS برای استفاده از مسیریاب 

- Published: 2016-07-09
- Language: fa
- Tags: DNTips
- Canonical: https://sirwan.info/blog/fa/dntips-2447

---

> این نوشته نخستین بار در [دات‌نت تیپس](https://www.dntips.ir/post/2447) منتشر شده است.

<div class="postBody">در این قسمت به معرفی سیستم مسیریاب در Angular 1.5 خواهیم پرداخت. قبل از معرفی این سیستم ابتدا سیستم مسیریاب اصلی در Angular را بررسی خواهیم کرد.<div> <br/> <div> <b>مروری بر مسیریابی در AngularJS</b> </div> <div>برای استفاده از مسیریاب اصلی Angular کافی است از دایرکتیو ویژه‌ایی با نام ng-view به همراه یکسری تنظیمات پیکربندی استفاده کنیم. به عنوان مثال اگر آدرس صفحه با home/ مطابقت داشته باشد، تمپلیت home.html توسط دایرکتیو ng-view بارگذاری خواهد شد. برای فعال‌سازی این سیستم ابتدا باید پکیج angular-route را <a href="/blog/fa/dntips-2417/">به پروژه مثال قسمت قبل</a>  اضافه کنید:</div> <div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">bower install angular-route --save</pre>
 </div>
در ادامه لازم است وابستگی فوق را به صفحه‌ی index.html اضافه نمائید:</div> <div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">&lt;script src="bower_components/angular-route/angular-route.min.js" type="text/javascript"&gt;&lt;/script&gt;</pre>
 </div>
اکنون درون صفحه به جای نمایش مستقیم کامپوننت، از دایرکتیو ng-view استفاده خواهیم کرد:</div> <div align="left" dir="ltr" style="direction: ltr;"> </div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="XML" name="code">&lt;div class="col-md-9"&gt;&#10;                &lt;ng-view&gt;&lt;/ng-view&gt;&#10;&lt;/div&gt;</pre>
 </div> <br/> <div> همچنین مقدار فیلد url کامپوننت dntWidget را به صورت زیر تغییر دهید: </div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">      model.panel = {&#10;          title: "Panel Title",&#10;          items: [&#10;              {&#10;                  title: "Home", url: "#/home"&#10;              },&#10;              {&#10;                  title: "Articles", url: "#/articles"&#10;              },&#10;              {&#10;                  title: "Authors", url: "#/authors"&#10;              }&#10;          ]&#10;      };</pre>
 </div> <br/> <div>در ادامه باید سیستم مسیریاب را به عنوان یک وابستگی به اپلیکیشن معرفی کنیم:</div> <div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">var module = angular.module("dntModule", ["ngRoute"]);</pre>
 </div>
اکنون می‌توانیم پیکربندی موردنظر جهت هدایت آدرس‌ها به تمپلیت‌های مربوطه را بنویسیم:</div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">module.config(function ($routeProvider) {&#10;        $routeProvider&#10;            .when("/home", { template: "&lt;app-home&gt;&lt;/app-home&gt;" })&#10;            .when("/articles", { template: "&lt;app-articles&gt;&lt;/app-articles&gt;" })&#10;            .when("/authors", { template: "&lt;app-authors&gt;&lt;/app-authors&gt;" })&#10;            .otherwise({ redirectTo: "/home" });&#10;    });</pre>
 </div> <br/> <div>همانطور که مشاهده می‌کنید به route provider اعلام کرده‌ایم که در صورت مطابقت داشتن آدرس URL با هر کدام از حالت‌های فوق، تمپلیت متناسب با آن را نمایش بدهد. در نهایت توسط otherwise اگر آدرس، با هیچکدام از حالت‌های تعریف شده مطابقت نداشت، کاربر به آدرس home/ هدایت خواهد شد. </div> <div>نکته‌ایی که در کد فوق وجود دارد این است که سیستم مسیریاب اصلی Angular تا اینجا هیچ اطلاعی از وجود کامپوننت‌ها ندارد، اما می‌داند یک تمپلیت چیست. بنابراین از تمپلیت، جهت نمایش یک کامپوننت استفاده خواهد کرد.</div> <div>برای ایجاد کامپوننت‌های فوق نیز می‌توانید آن را به صورت زیر ایجاد کنید:</div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">module.component("appHome", {&#10;        template: `&#10;        &lt;hr&gt;&lt;div&gt;&#10;            &lt;div&gt;Panel heading = HomePage&lt;/div&gt;&#10;            &lt;div&gt;&#10;                HomePage&#10;            &lt;/div&gt;&#10;        &lt;/div&gt;`&#10;    });&#10;    module.component("appArticles", {&#10;        template: `&#10;        &lt;hr&gt;&lt;div&gt;&#10;            &lt;div&gt;Panel heading = Articles&lt;/div&gt;&#10;            &lt;div&gt;&#10;                Articles&#10;            &lt;/div&gt;&#10;        &lt;/div&gt;`&#10;    });&#10;    module.component("appAuthors", {&#10;        template: `&#10;        &lt;hr&gt;&lt;div&gt;&#10;            &lt;div&gt;Panel heading = Authors&lt;/div&gt;&#10;            &lt;div&gt;&#10;                Authors&#10;            &lt;/div&gt;&#10;        &lt;/div&gt;`&#10;    });</pre>
 </div> <br/> <div> <div align="left" dir="ltr" style="direction: ltr;"> </div>
اکنون اگر برنامه را اجرا کنید، خواهید دید که به صورت پیش‌فرض به آدرس home/# هدایت خواهیم شد. زیرا آدرسی برای root، درون route configuration تعریف نکرده‌ایم:<br/> <br/> </div> <div> <p style="margin-left: auto; margin-right: auto;"> <img src="/img/dntips/5d3cc5ed82be622adf97.jpg" style="display: block; margin-left: auto; margin-right: auto; cursor: default; width: 849.163px; height: 340px;"/> </p> <p style="margin-left: auto; margin-right: auto;">اکنون توسط لینک‌های تعریف شده می‌توانیم به راحتی درون تمپلیت‌ها، پیمایش کنیم. همانطور که عنوان شد تا اینجا مسیریاب پیش‌فرض Angular هیچ اطلاعی از کامپوننت‌ها ندارد؛ بلکه آنها را با کمک template، به صورت غیر مستقیم، درون صفحه نمایش داده‌ایم.</p> <p style="margin-left: auto; margin-right: auto;"> <br/> </p> <p style="margin-left: auto; margin-right: auto;"> <b>معرفی Component Router</b> </p> <p style="margin-left: auto; margin-right: auto;">مزیت این روتر این است که به صورت اختصاصی برای کار با کامپوننت‌ها طراحی شده است. بنابراین دیگر نیازی به استفاده از template درون route configuration نیست. برای استفاده از این روتر ابتدا باید پکیج آن را نصب کنیم:</p> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">bower install angular-component-router --save</pre>
 </div> <p style="margin-left: auto; margin-right: auto;">سپس وابستگی فوق را با روتر پیش‌فرضی که <a href="/blog/fa/dntips-2417/">در مثال قبل</a>  بررسی کردیم، جایگزین خواهیم کرد:</p> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">&lt;script src="bower_components/angular-component-router/angular_1_router.js"&gt;&lt;/script&gt;</pre>
 </div> <p style="margin-left: auto; margin-right: auto;">همچنین درون فایل module.js به جای وابستگی ngRoute از ngComponentrouter استفاده خواهیم کرد:</p> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">var module = angular.module("dntModule", ["ngComponentRouter"]);</pre>
 </div> <p style="margin-left: auto; margin-right: auto;">در ادامه به جای تمامی route configurations قبلی، اینبار یک کامپوننت جدید را به صورت زیر ایجاد خواهیم کرد:</p> <div align="left" dir="ltr" style="direction: ltr;"> </div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">module.component("appHome", {&#10;        template: `&#10;        &lt;hr&gt;&#10;        &lt;div&gt;&#10;            &lt;div&gt;Panel heading = HomePage&lt;/div&gt;&#10;            &lt;div&gt;&#10;                HomePage&#10;            &lt;/div&gt;&#10;        &lt;/div&gt;`&#10;    });</pre>
 </div> <p style="margin-left: auto; margin-right: auto;">همانطور که مشاهده می‌کنید برای پاسخ‌گویی به تغییرات URL، مقدار routeConfig$ را مقداردهی کرده‌ایم. در اینجا به جای بارگذاری تمپلیت، خود کامپوننت، در هر یک از ruleهای فوق بارگذاری خواهد شد. برای حالت otherwise نیز از سینتکس **/ استفاده کرده‌ایم.<br/> </p> <p style="margin-left: auto; margin-right: auto;">تمپلیت کامپوننت فوق نیز به صورت زیر است:<br/> </p> <div align="left" dir="ltr" style="direction: ltr;"> </div> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="XML" name="code">&lt;div class="container"&gt;&#10;    &lt;div class="row"&gt;&#10;        &lt;div class="col-md-3"&gt;&#10;            &lt;hr&gt;&#10;            &lt;dnt-widget&gt;&lt;/dnt-widget&gt;&#10;        &lt;/div&gt;&#10;        &lt;div class="col-md-9"&gt;&#10;            &lt;ng-outlet&gt;&lt;/ng-outlet&gt;&#10;        &lt;/div&gt;&#10;    &lt;/div&gt;&#10;&lt;/div&gt;</pre>
 </div> <p style="margin-left: auto; margin-right: auto;">لازم به ذکر است دیگر نباید از دایرکتیو  ng-view استفاده کنیم؛ زیرا این دایرکتیو برای استفاده از روتر اصلی طراحی شده است. به جای آن از دایرکتیو ng-outlet استفاده شده است. این کامپوننت به عنوان یک کامپوننت top level عمل خواهد کرد. بنابراین درون صفحه‌ی index.html از کامپوننت فوق استفاده خواهیم کرد:</p> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="XML" name="code">&lt;html ng-app="dntModule"&gt;&#10;&lt;head&gt;&#10;    &lt;meta charset="UTF-8"&gt;&#10;    &lt;title&gt;Using Angular 1.5 Component Router&lt;/title&gt;&#10;    &lt;link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css"&gt;&#10;    &lt;link rel="stylesheet" href="bower_components/font-awesome/css/font-awesome.min.css"&gt;&#10;&lt;/head&gt;&#10;&lt;body&gt;&#10;    &#10;    &lt;dnt-app&gt;&lt;/dnt-app&gt;&#10;&#10;    &lt;script src="bower_components/angular/angular.js" type="text/javascript"&gt;&lt;/script&gt;&#10;    &lt;script src="bower_components/angular-component-router/angular_1_router.js"&gt;&lt;/script&gt;&#10;    &lt;script src="scripts/module.js" type="text/javascript"&gt;&lt;/script&gt;&#10;    &lt;script src="scripts/dnt-app.component.js"&gt;&lt;/script&gt;&#10;    &lt;script src="scripts/dnt-widget.component.js"&gt;&lt;/script&gt;&#10;&lt;/body&gt;&#10;&lt;/html&gt;</pre>
 </div> <p style="margin-left: auto; margin-right: auto;"> <span style="line-height: 1.5em;">در نهایت باید جهت فعال‌سازی سیستم مسیریابی جدید، سرویس زیر را همراه با نام کامپوننت فوق ریجستر کنیم:</span> </p> <div align="left" dir="ltr" style="direction: ltr;">
<pre language="JScript" name="code">module.value("$routerRootComponent", "dntApp");</pre>
 </div> <p style="margin-left: auto; margin-right: auto;">اکنون اگر برنامه را اجرا کنید خواهید دید که همانند قبل، کار خواهد کرد. اما اینبار از روتر جدید و سازگار با کامپوننت‌ها استفاده می‌کند.</p> <p style="margin-left: auto; margin-right: auto;">کدهای این قسمت را نیز از <a href="https://github.com/SirwanAfifi/ng-component_routing">اینجا</a> می‌توانید دریافت کنید.  <br/> </p> </div> </div></div>
