diff --git a/Book.html b/Book.html index 7c072c3..d1eef72 100644 --- a/Book.html +++ b/Book.html @@ -250,15 +250,256 @@ }html body{font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;color:#333;background-color:#fff;overflow:initial;box-sizing:border-box;word-wrap:break-word}html body>:first-child{margin-top:0}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{line-height:1.2;margin-top:1em;margin-bottom:16px;color:#000}html body h1{font-size:2.25em;font-weight:300;padding-bottom:.3em}html body h2{font-size:1.75em;font-weight:400;padding-bottom:.3em}html body h3{font-size:1.5em;font-weight:500}html body h4{font-size:1.25em;font-weight:600}html body h5{font-size:1.1em;font-weight:600}html body h6{font-size:1em;font-weight:600}html body h1,html body h2,html body h3,html body h4,html body h5{font-weight:600}html body h5{font-size:1em}html body h6{color:#5c5c5c}html body strong{color:#000}html body del{color:#5c5c5c}html body a:not([href]){color:inherit;text-decoration:none}html body a{color:#08c;text-decoration:none}html body a:hover{color:#00a3f5;text-decoration:none}html body img{max-width:100%}html body>p{margin-top:0;margin-bottom:16px;word-wrap:break-word}html body>ul,html body>ol{margin-bottom:16px}html body ul,html body ol{padding-left:2em}html body ul.no-list,html body ol.no-list{padding:0;list-style-type:none}html body ul ul,html body ul ol,html body ol ol,html body ol ul{margin-top:0;margin-bottom:0}html body li{margin-bottom:0}html body li.task-list-item{list-style:none}html body li>p{margin-top:0;margin-bottom:0}html body .task-list-item-checkbox{margin:0 .2em .25em -1.8em;vertical-align:middle}html body .task-list-item-checkbox:hover{cursor:pointer}html body blockquote{margin:16px 0;font-size:inherit;padding:0 15px;color:#5c5c5c;background-color:#f0f0f0;border-left:4px solid #d6d6d6}html body blockquote>:first-child{margin-top:0}html body blockquote>:last-child{margin-bottom:0}html body hr{height:4px;margin:32px 0;background-color:#d6d6d6;border:0 none}html body table{margin:10px 0 15px 0;border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}html body table th{font-weight:bold;color:#000}html body table td,html body table th{border:1px solid #d6d6d6;padding:6px 13px}html body dl{padding:0}html body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:bold}html body dl dd{padding:0 16px;margin-bottom:16px}html body code{font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:.85em !important;color:#000;background-color:#f0f0f0;border-radius:3px;padding:.2em 0}html body code::before,html body code::after{letter-spacing:-0.2em;content:"\00a0"}html body pre>code{padding:0;margin:0;font-size:.85em !important;word-break:normal;white-space:pre;background:transparent;border:0}html body .highlight{margin-bottom:16px}html body .highlight pre,html body pre{padding:1em;overflow:auto;font-size:.85em !important;line-height:1.45;border:#d6d6d6;border-radius:3px}html body .highlight pre{margin-bottom:0;word-break:normal}html body pre code,html body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}html body pre code:before,html body pre tt:before,html body pre code:after,html body pre tt:after{content:normal}html body p,html body blockquote,html body ul,html body ol,html body dl,html body pre{margin-top:0;margin-bottom:16px}html body kbd{color:#000;border:1px solid #d6d6d6;border-bottom:2px solid #c7c7c7;padding:2px 4px;background-color:#f0f0f0;border-radius:3px}@media print{html body{background-color:#fff}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{color:#000;page-break-after:avoid}html body blockquote{color:#5c5c5c}html body pre{page-break-inside:avoid}html body table{display:table}html body img{display:block;max-width:100%;max-height:100%}html body pre,html body code{word-wrap:break-word;white-space:pre}} /* Please visit the URL below for more information: */ /* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */ +@font-face { + font-family: BYekan; + src: url("fonts/yekan/BYekan.woff") format("woff"); +} +@font-face { + font-family: Vazir; + src: url('fonts/vazir/Farsi-Digits/Vazir-FD.eot'); + src: url('fonts/vazir/Farsi-Digits/Vazir-FD.eot?#iefix') format('embedded-opentype'), url('fonts/vazir/Farsi-Digits/Vazir-FD.woff2') format('woff2'), url('fonts/vazir/Farsi-Digits/Vazir-FD.woff') format('woff'), url('fonts/vazir/Farsi-Digits/Vazir-FD.ttf') format('truetype'); + font-weight: normal; +} +@font-face { + font-family: Vazir; + src: url('fonts/vazir/Farsi-Digits/Vazir-Bold-FD.eot'); + src: url('fonts/vazir/Farsi-Digits/Vazir-Bold-FD.eot?#iefix') format('embedded-opentype'), url('fonts/vazir/Farsi-Digits/Vazir-Bold-FD.woff2') format('woff2'), url('fonts/vazir/Farsi-Digits/Vazir-Bold-FD.woff') format('woff'), url('fonts/vazir/Farsi-Digits/Vazir-Bold-FD.ttf') format('truetype'); + font-weight: bold; +} +@font-face { + font-family: Vazir; + src: url('fonts/vazir/Farsi-Digits/Vazir-Thin-FD.eot'); + src: url('fonts/vazir/Farsi-Digits/Vazir-Thin-FD.eot?#iefix') format('embedded-opentype'), url('fonts/vazir/Farsi-Digits/Vazir-Thin-FD.woff2') format('woff2'), url('fonts/vazir/Farsi-Digits/Vazir-Thin-FD.woff') format('woff'), url('fonts/vazir/Farsi-Digits/Vazir-Thin-FD.ttf') format('truetype'); + font-weight: 100; +} +@font-face { + font-family: Vazir; + src: url('fonts/vazir/Farsi-Digits/Vazir-Light-FD.eot'); + src: url('fonts/vazir/Farsi-Digits/Vazir-Light-FD.eot?#iefix') format('embedded-opentype'), url('fonts/vazir/Farsi-Digits/Vazir-Light-FD.woff2') format('woff2'), url('fonts/vazir/Farsi-Digits/Vazir-Light-FD.woff') format('woff'), url('fonts/vazir/Farsi-Digits/Vazir-Light-FD.ttf') format('truetype'); + font-weight: 300; +} +@font-face { + font-family: Vazir; + src: url('fonts/vazir/Farsi-Digits/Vazir-Medium-FD.eot'); + src: url('fonts/vazir/Farsi-Digits/Vazir-Medium-FD.eot?#iefix') format('embedded-opentype'), url('fonts/vazir/Farsi-Digits/Vazir-Medium-FD.woff2') format('woff2'), url('fonts/vazir/Farsi-Digits/Vazir-Medium-FD.woff') format('woff'), url('fonts/vazir/Farsi-Digits/Vazir-Medium-FD.ttf') format('truetype'); + font-weight: 500; +} +@font-face { + font-family: Vazir; + src: url('fonts/vazir/Farsi-Digits/Vazir-Black-FD.eot'); + src: url('fonts/vazir/Farsi-Digits/Vazir-Black-FD.eot?#iefix') format('embedded-opentype'), url('fonts/vazir/Farsi-Digits/Vazir-Black-FD.woff2') format('woff2'), url('fonts/vazir/Farsi-Digits/Vazir-Black-FD.woff') format('woff'), url('fonts/vazir/Farsi-Digits/Vazir-Black-FD.ttf') format('truetype'); + font-weight: 900; +} +html { + scroll-behavior: smooth; +} +.markdown-preview.markdown-preview { + scroll-behavior: smooth; + font-family: Vazir, sans-serif; + color: #333; + font-size: 14px; + background: transparent; +} +.markdown-preview.markdown-preview h1 { + font-family: Vazir; + font-weight: 900; +} +.markdown-preview.markdown-preview h2 { + font-weight: 600; +} +.markdown-preview.markdown-preview a, +.markdown-preview.markdown-preview h1 > a, +.markdown-preview.markdown-preview h2 > a, +.markdown-preview.markdown-preview h3 > a, +.markdown-preview.markdown-preview h4 > a, +.markdown-preview.markdown-preview h5 > a { + color: #222; +} +.markdown-preview.markdown-preview table { + font-family: Vazir; +} +.markdown-preview.markdown-preview .backToTop { + color: #808aff !important; +} +.markdown-preview.markdown-preview h1, +.markdown-preview.markdown-preview h2 { + padding-bottom: 0.3em; + border-bottom: 1px solid #eaecef; +} +.markdown-preview.markdown-preview .yekan, +.markdown-preview.markdown-preview td:first-child { + font-family: BYekan; +} +.markdown-preview.markdown-preview p > strong > a { + margin: 20px 0 40px 0; + display: block; +} +.markdown-preview.markdown-preview p > strong > a::before { + content: "⬆ "; +} +.markdown-preview.markdown-preview p > strong > a::after { + content: " مطالب"; +} +.markdown-preview.markdown-preview tr:nth-child(2n) { + background-color: #f6f8fa; +} +.markdown-preview.markdown-preview [dir="rtl"] blockquote { + border-left: none; + border-right: 4px solid #d6d6d6; + padding: 12px; +} +.markdown-preview.markdown-preview .rtl { + direction: rtl; +} +.markdown-preview.markdown-preview .center { + display: flex !important; + justify-content: center; + align-items: center; +} +.markdown-preview.markdown-preview .a4 { + position: relative; + direction: rtl; + display: block; + width: 100%; + min-height: 210mm; + max-height: 212mm; +} +.markdown-preview.markdown-preview .a4.pishgoftar { + margin-top: 190mm; + min-height: 420mm; + max-height: 420mm; +} +.markdown-preview.markdown-preview .a4 img { + max-height: 300px; +} +.markdown-preview.markdown-preview ol { + font-family: BYekan; +} +.markdown-preview.markdown-preview ol h1, +.markdown-preview.markdown-preview ol h2, +.markdown-preview.markdown-preview ol h3, +.markdown-preview.markdown-preview ol h4, +.markdown-preview.markdown-preview ol h5, +.markdown-preview.markdown-preview ol p { + font-family: Vazir; +} +.markdown-preview.markdown-preview .font-black { + font-family: Vazir; + font-weight: 900; +} +.markdown-preview.markdown-preview .book-starter { + position: absolute; + top: 10px; + left: 50%; + transform: translate(-50%); + text-align: center; + font-size: 12px; +} +.markdown-preview.markdown-preview .book-name { + position: absolute; + top: 20%; + left: 50%; + width: 80%; + transform: translate(-50%); + text-align: center; + flex-direction: column; + border-right: 15px solid #f0f0f0; + text-align: right; + align-items: start !important; + padding-right: 26px; +} +.markdown-preview.markdown-preview .book-name span { + font-size: 34px; + margin-right: 8px; +} +.markdown-preview.markdown-preview .book-name .font-black { + font-size: 50px; +} +.markdown-preview.markdown-preview .book-author { + position: absolute; + bottom: 10px; + left: 50%; + transform: translate(-50%); + text-align: center; +} +.markdown-preview.markdown-preview .empty { + min-height: 21mm !important; + max-height: 21mm !important; +} +.markdown-preview.markdown-preview .show-in-print { + display: none; +} +@media print { + .markdown-preview.markdown-preview .empty { + display: block; + width: 100%; + min-height: 213mm !important; + max-height: 213mm !important; + } + .markdown-preview.markdown-preview .hide-in-print, + .markdown-preview.markdown-preview .main-title { + display: none; + } + .markdown-preview.markdown-preview .show-in-print { + display: block; + } + .markdown-preview.markdown-preview .backToTop { + font-size: 0; + } + .markdown-preview.markdown-preview pre { + white-space: pre-wrap; + } + .markdown-preview.markdown-preview h3 { + font-size: 1.3em !important; + } +} +.markdown-preview.markdown-preview .hider { + position: absolute; + top: 213mm; + left: 50%; + transform: translate(-50%, -20px); + background: #000; + width: 20px; + height: 20px; +} +.markdown-preview.markdown-preview .hider:nth-child(2) { + top: 426mm; +} +.markdown-preview.markdown-preview .hider:nth-child(3) { + top: 639mm; +} +.markdown-preview.markdown-preview .hider:nth-child(4) { + top: 852mm; +} +.markdown-preview.markdown-preview .hider:nth-child(5) { + top: 600mm; +} - +
@@ -267,7 +508,7 @@اگه از کتاب خوشتون اومد به گیتهابمون مراجعه کنین و بهمون ⭐️ بدین. اگر هم قصد مشارکت داشتید همونجا میتونین شروع کنین و ما هم خیلی خوشحال میشیم 😃
لینک گیتهاب ما برای مشارکت برای تولید کتابها: https://github.com/mariotek
-میتونین خیلی راحت نسخه آنلاین کتاب استفاده کنین یا اگه به فایل کتاب میخوایین دسترسی داشته باشین، از بخش ریلیزهای گیتهاب به فرمتهای مختلف آخرین نسخه کتاب رو میتونین دریافت کنین.
Angular یک پلتفرم فرانتاند منبع باز مبتنی بر TypeScript است که ساخت برنامهها را در وب/موبایل/کامپیوتر آسان میکند. از ویژگی های اصلی این فریم ورک مانند قالب های اعلامی، تزریق وابستگی، ابزارهای انتها به انتها و بسیاری ویژگی های دیگر برای سهولت توسعه استفاده می شود.
- +Angular یک فریم ورک کاملاً احیا شده مبتنی بر مؤلفه است که در آن یک برنامه کاربردی درختی از اجزای جداگانه است.
TypeScript یک ابر مجموعه تایپ شده از جاوا اسکریپت است که توسط مایکروسافت ایجاد شده است که انواع اختیاری، کلاس ها، async/wait و بسیاری ویژگی های دیگر را اضافه می کند و به جاوا اسکریپت ساده کامپایل می کند. Angular به طور کامل در TypeScript ساخته شده و به عنوان زبان اصلی استفاده می شود.
شما می توانید آن را به صورت جهانی نصب کنید
متد greeter فقط نوع رشته را به عنوان آرگومان مجاز می کند.
- +بلوک های ساختمان اصلی یک برنامه Angular در نمودار زیر نشان داده شده است
Component: اینها بلوک های ساختمانی اصلی برنامه های زاویه ای برای کنترل نماهای HTML هستند.
Modules: یک ماژول زاویهای مجموعهای از بلوکهای ساختمانی پایه زاویهای مانند کامپوننت، دستورالعملها، خدمات و غیره است. یک برنامه کاربردی به قطعات منطقی تقسیم میشود و هر قطعه کد به عنوان "ماژول" نامیده میشود که یک وظیفه را انجام میدهد.
Templates: این نماهای یک برنامه Angular را نشان می دهد.
Services: برای ایجاد مؤلفه هایی استفاده می شود که می توانند در کل برنامه به اشتراک گذاشته شوند.
Metadata: این می تواند برای افزودن داده های بیشتر به یک کلاس Angular استفاده شود.
directives ها رفتاری را به یک عنصر DOM موجود یا یک نمونه جزء موجود اضافه می کنند.
import { Directive, ElementRef, Input } from '@angular/core'; @@ -1480,10 +1721,10 @@directives ها چیا هستن
+<p myHighlight>Highlight me!</p>-
کامپوننت ها اساسی ترین بلوک سازنده رابط کاربری یک برنامه Angular هستند که درختی از اجزای Angular را تشکیل می دهند. این مؤلفه ها زیر مجموعه دستورالعمل ها هستند. برخلاف دستورات، کامپوننتها همیشه دارای یک الگو هستند و تنها یک جزء را میتوان به ازای هر عنصر در قالب نمونهسازی کرد.
بیایید یک مثال ساده از کامپوننت Angular را ببینیم
در یک یادداشت کوتاه، A component(@component) یک دستورالعمل-با-الگو است.
برخی از تفاوت های عمده به صورت جدولی ذکر شده است
یک الگو یک نمای HTML است که در آن می توانید داده ها را با اتصال کنترل ها به ویژگی های یک جزء Angular نمایش دهید. می توانید الگوی جزء خود را در یکی از دو مکان ذخیره کنید. می توانید با استفاده از ویژگی template آن را به صورت درون خطی تعریف کنید، یا می توانید قالب را در یک فایل HTML جداگانه تعریف کنید و با استفاده از ویژگی templateUrl@Component decorator به آن در ابرداده کامپوننت پیوند دهید.
Using inline template with template syntax,
@@ -1573,10 +1814,10 @@ماژول ها مرزهای منطقی در برنامه شما هستند و برنامه به ماژول های جداگانه تقسیم می شود تا عملکرد برنامه شما را از هم جدا کند.
بیایید مثالی از app.module.ts ماژول ریشه ای را که با دکوراتور @NgModule به شرح زیر اعلام شده است، بیاوریم.
دکوراتور NgModule پنج گزینه مهم (در میان همه) دارد
گزینه imports برای وارد کردن ماژول های وابسته دیگر استفاده می شود. BrowserModule به طور پیش فرض برای هر برنامه زاویه ای مبتنی بر وب مورد نیاز است
گزینه declarations برای تعریف اجزا در ماژول مربوطه استفاده می شود
گزینه bootstrap به Angular می گوید که کدام کامپوننت را در برنامه بوت استرپ کند
گزینه providers برای پیکربندی مجموعه ای از اشیاء تزریقی موجود در انژکتور این ماژول استفاده می شود.
گزینه enterComponents مجموعه ای از اجزایی است که به صورت پویا در view بارگذاری می شوند.
برنامه Angular مجموعه کاملی از فرآیندها را طی می کند یا از زمان شروع تا پایان برنامه یک چرخه حیات دارد.
نمایش چرخه حیات در نمایش تصویری به شرح زیر است:
ngOnChanges: هنگامی که مقدار یک ویژگی داده محدود تغییر می کند، این روش فراخوانی می شود.
ngOnInit: هر زمان که مقداردهی اولیه دستور/کامپوننت پس از نمایش Angular برای اولین بار خصوصیات داده محدود اتفاق بیفتد، فراخوانی می شود.
ngDoCheck: این برای تشخیص و اعمال تغییراتی است که Angular به تنهایی قادر به تشخیص آنها نیست یا نخواهد بود.
ngAfterContentInit: پس از اینکه Angular محتوای خارجی را در نمای کامپوننت پروژه می دهد، در پاسخ به این امر فراخوانی می شود.
ngAfterContentChecked: این در پاسخ پس از بررسی Angular محتوای پیش بینی شده در کامپوننت فراخوانی می شود.
ngAfterViewInit: پس از اینکه Angular نماهای کامپوننت و نماهای فرزند را مقدار دهی اولیه کرد، در پاسخ فراخوانی می شود.
ngAfterViewChecked: این در پاسخ پس از بررسی Angular نماهای کامپوننت و نماهای فرزند فراخوانی می شود.
ngOnDestroy: این مرحله پاکسازی درست قبل از اینکه Angular دستور/کامپوننت را از بین ببرد است.
Data binding یک مفهوم اصلی در Angular است و امکان تعریف ارتباط بین یک مؤلفه و DOM را فراهم می کند و تعریف برنامه های تعاملی را بدون نگرانی در مورد فشار دادن و کشیدن داده ها بسیار آسان می کند. چهار شکل اتصال داده وجود دارد (به 3 دسته تقسیم می شود) که در نحوه جریان داده ها متفاوت است.
From the Component to the DOM:
Interpolation: {{ value }}: مقدار یک ویژگی را از جزء اضافه می کند
@@ -1648,13 +1889,13 @@<input type="email" [(ngModel)]="user.email">
-
+
متادیتا برای تزئین یک کلاس استفاده می شود تا بتواند رفتار مورد انتظار کلاس را پیکربندی کند. ابرداده توسط دکوراتورها نمایش داده می شود
Class decorators, به عنوان مثال، @Component و @NgModule
import { NgModule, Component } from '@angular/core'; @@ -1681,7 +1922,7 @@What is metadata?
}
Property decorators برای ویژگی های داخل کلاس ها استفاده می شود، به عنوان مثال. @import و export
import { Component, Input } from '@angular/core'; @@ -1697,7 +1938,7 @@What is metadata?
}
Method decorators برای متدهای داخل کلاس ها استفاده می شود، به عنوان مثال. @HostListener
import { Component, HostListener } from '@angular/core'; @@ -1714,7 +1955,7 @@What is metadata?
}
Parameter decorators برای پارامترهای داخل سازنده کلاس استفاده می شود، به عنوان مثال. @Inject، اختیاری
import { Component, Inject } from '@angular/core'; @@ -1730,10 +1971,10 @@- +What is metadata?
} }
Angular CLI (** Command Line Interface**) یک رابط خط فرمان برای ساخت داربست و ساخت برنامه های زاویه ای با استفاده از ماژول های سبک nodejs (commonJs) است.
شما باید با استفاده از دستور زیر npm نصب کنید،
Generating Components, Directives & Services: ng generate/g
انواع مختلف دستورات عبارتند از
ng generate class my-new-class: یک کلاس به برنامه خود اضافه کنید
ng تولید کامپوننت my-new-component: یک جزء به برنامه خود اضافه کنید
ng generate directive my-new-directive: یک دستورالعمل به برنامه خود اضافه کنید
ng generate enum my-new-enum: یک enum به برنامه خود اضافه کنید
ng generate module my-new-module: یک ماژول به برنامه خود اضافه کنید
تولید لوله my-new-pipe: یک لوله به برنامه خود اضافه کنید
ng generate service my-new-service: یک سرویس به برنامه خود اضافه کنید
Running the Project: ng serve
کلاس های TypeScript دارای یک روش پیش فرض به نام سازنده است که معمولاً برای هدف اولیه استفاده می شود. در حالی که روش ngOnInit مختص Angular است، به ویژه برای تعریف اتصالات Angular استفاده می شود. حتی اگر سازنده ابتدا فراخوانی میشود، ترجیح داده میشود همه اتصالات Angular خود را به متد ngOnInit منتقل کنید.
برای استفاده از ngOnInit، باید رابط OnInit را به صورت زیر پیاده سازی کنید.
یک سرویس زمانی استفاده می شود که یک عملکرد مشترک باید به ماژول های مختلف ارائه شود. سرویسها به شما اجازه میدهند تا نگرانیهای مربوط به برنامه شما را بیشتر از هم جدا کرده و ماژولاریت بهتری داشته باشید، زیرا به شما امکان میدهد عملکردهای مشترک را از اجزا استخراج کنید.
بیایید یک repoService ایجاد کنیم که می تواند در بین اجزاء مورد استفاده قرار گیرد،
@@ -1802,19 +2043,19 @@سرویس فوق از سرویس Http به عنوان یک وابستگی استفاده می کند.
- +تزریق وابستگی (DI)، یک الگوی طراحی برنامه مهم است که در آن یک کلاس به جای ایجاد وابستگی از منابع خارجی درخواست میکند. Angular با چارچوب تزریق وابستگی خود برای حل وابستگی ها (سرویس ها یا اشیایی که یک کلاس برای انجام عملکرد خود به آن نیاز دارد) ارائه می شود. بنابراین می توانید خدمات خود را در سراسر برنامه به سرویس های دیگر وابسته کنید.
- +AsyncPipe مشترک یک قابل مشاهده یا قول می شود و آخرین مقداری را که منتشر کرده است برمی گرداند. هنگامی که یک مقدار جدید منتشر می شود، لوله مؤلفه ای را که باید بررسی شود برای تغییرات علامت گذاری می کند.
بیایید یک زمان قابل مشاهده را در نظر بگیریم که به طور مداوم نما را برای هر 2 ثانیه با زمان فعلی به روز می کند.
@@ -1829,19 +2070,19 @@می توانید الگوی جزء خود را در یکی از دو مکان ذخیره کنید. می توانید آن را به صورت درون خطی با استفاده از ویژگی template تعریف کنید، یا می توانید الگو را در یک فایل HTML جداگانه تعریف کنید و با استفاده از ویژگی templateUrl در decorator @Component به آن در ابرداده کامپوننت پیوند دهید.
انتخاب بین HTML درون خطی و مجزا یک موضوع سلیقه، شرایط و خط مشی سازمان است. اما معمولاً از قالب درون خطی برای بخش کوچکی از کد و از فایل قالب خارجی برای نمایش های بزرگتر استفاده می کنیم. به طور پیش فرض، Angular CLI کامپوننت ها را با یک فایل الگو تولید می کند. اما می توانید با دستور زیر آن را لغو کنید
ng generate component hero -it- +
ما از دستورالعمل Angular ngFor در قالب برای نمایش هر آیتم در لیست استفاده می کنیم. به عنوان مثال، در اینجا ما روی لیست کاربران تکرار می کنیم،
<li *ngFor="let user of users"> @@ -1849,19 +2090,19 @@هدف از directive ngFor چی ه& </li>
متغیر کاربر در دستورالعمل ngFor دو نقل قول a استtemplate input variable
- +گاهی اوقات یک برنامه فقط در شرایط خاص نیاز به نمایش یک نما یا بخشی از یک نما دارد. دستورالعمل Angular ngIf یک عنصر را بر اساس شرایط درستی/نادرستی درج یا حذف می کند. اگر سن کاربر بیش از 18 سال باشد، برای نمایش پیام مثالی می زنیم.
<p *ngIf="user.age > 18">You are not eligible for student pass!</p>
Note: Angular پیام را نشان نمی دهد و پنهان نمی کند. در حال افزودن و حذف عنصر پاراگراف از DOM است. که عملکرد را بهبود می بخشد، به خصوص در پروژه های بزرگتر با اتصال داده های زیادی.
- +Angular مقدار را ناامن تشخیص میدهد و بهطور خودکار آن را پاکسازی میکند، که تگ «اسکریپت» را حذف میکند اما محتوای ایمن مانند محتوای متنی برچسب «اسکریپت» را حفظ میکند. به این ترتیب خطر حملات تزریق اسکریپت را از بین می برد. اگر همچنان از آن استفاده می کنید، نادیده گرفته می شود و یک هشدار در کنسول مرورگر ظاهر می شود.
بیایید مثالی از اتصال ویژگی innerHtml که باعث آسیبپذیری XSS میشود، بیاوریم.
@@ -1870,10 +2111,10 @@درون یابی یک نحو خاص است که Angular آن را به ویژگی binding تبدیل می کند. این یک جایگزین مناسب برای اتصال اموال است. با مهاربندهای دوتایی ({{}}) نشان داده می شود. متن بین پرانتزها اغلب نام یک ویژگی جزء است. Angular آن نام را با مقدار رشته خاصیت جزء مربوطه جایگزین می کند.
بیایید یک مثال بزنیم،
@@ -1883,10 +2124,10 @@در مثال بالا، Angular خصوصیات عنوان و url را ارزیابی می کند و جاهای خالی را پر می کند، ابتدا عنوان برنامه پررنگ و سپس URL نمایش داده می شود.
- +یک عبارت الگو مقداری شبیه به هر عبارت جاوا اسکریپت تولید می کند. Angular عبارت را اجرا می کند و آن را به خاصیت یک هدف الزام آور اختصاص می دهد. هدف ممکن است یک عنصر HTML، یک جزء یا یک دستورالعمل باشد. در ویژگی binding، یک عبارت الگو در نقل قول در سمت راست نماد = مانند [property]="expression ظاهر می شود.
در نحو درون یابی، عبارت الگو با پرانتزهای مجعد دوتایی احاطه شده است. به عنوان مثال، در درون یابی زیر، عبارت الگو {{username}} است،
عبارات جاوا اسکریپت زیر در عبارت قالب ممنوع هستند
assignments (=، +=، -=، ...)
new
زنجیره عبارات با ; یا ،
عملگرهای افزایش و کاهش (++ و --)
یک عبارت الگو به رویدادی پاسخ می دهد که توسط یک هدف الزام آور مانند یک عنصر، مؤلفه یا دستورالعمل ایجاد شده است. عبارات الگو در نقل قول در سمت راست نماد = مانند (رویداد)="statement" ظاهر می شوند.
Let's take an example of button click event's statement
@@ -1911,22 +2152,22 @@در عبارت بالا، editProfile یک عبارت الگو است. عبارات نحوی جاوا اسکریپت زیر مجاز نیستند.
جدید
عملگرهای افزایش و کاهش، ++ و --
انتساب عملگر، مانند += و -=
عملگرهای بیتی | و &
عملگرهای عبارت الگو
انواع اتصال را می توان به سه دسته دسته بندی کرد که با جهت جریان داده ها متمایز می شوند. آنها به صورت زیر فهرست شده اند،
از منبع به مشاهده
از دیدگاه به منبع
View-to-source-to-view
نحو ممکن الزام آور را می توان به صورت جدولی در زیر ارائه کرد:
یک لوله داده ها را به عنوان ورودی می گیرد و آن را به خروجی دلخواه تبدیل می کند. به عنوان مثال، اجازه دهید یک لوله را برای تبدیل ویژگی تولد یک جزء به تاریخ دوستداشتنی با استفاده از لوله date در نظر بگیریم.
import { Component } from '@angular/core'; @@ -1971,10 +2212,10 @@- +pipe ها چیا هستن؟ birthday = new Date(1987, 6, 18); // June 18, 1987 }
یک لوله می تواند هر تعداد پارامتر اختیاری را برای تنظیم دقیق خروجی خود بپذیرد. لوله پارامتر شده را می توان با اعلام نام لوله با علامت دو نقطه ( : ) و سپس مقدار پارامتر ایجاد کرد. اگر لوله چندین پارامتر را می پذیرد، مقادیر را با دو نقطه جدا کنید. بیایید یک مثال تولد با یک قالب خاص (dd/MM/yyyy) در نظر بگیریم:
import { Component } from '@angular/core'; @@ -1988,10 +2229,10 @@یه منظور از pipe g }
Note: مقدار پارامتر می تواند هر عبارت الگوی معتبری باشد، مانند یک رشته لفظی یا یک ویژگی جزء.
- +میتوانید لولهها را در ترکیبهای بالقوه مفید بر حسب نیاز به هم زنجیر کنید. بیایید یک ویژگی تولد را در نظر بگیریم که از لوله تاریخ (همراه با پارامتر) و لوله های بزرگ مانند زیر استفاده می کند
import { Component } from '@angular/core'; @@ -2005,10 +2246,10 @@- +چطوری زنجیرd }
جدا از لوله های داخلی، می توانید لوله سفارشی خود را با ویژگی های کلیدی زیر بنویسید:
دکوراتور @Pipe به شما امکان می دهد نام لوله ای را که در عبارات قالب استفاده می کنید، تعریف کنید. باید یک شناسه جاوا اسکریپت معتبر باشد.
template: `{{someInputValue | myCustomPipe: someOtherValue}}`
-شما می توانید لوله های قابل استفاده مجدد سفارشی برای تغییر ارزش موجود ایجاد کنید. به عنوان مثال، اجازه دهید یک لوله سفارشی برای یافتن اندازه فایل بر اساس پسوند ایجاد کنیم،
import { Pipe, PipeTransform } from '@angular/core'; @@ -2054,15 +2295,15 @@- +یه مثال از pipe سd <p>Size: {{288966 | customFileSizePipe: 'GB'}}</p> `
یک لوله خالص تنها زمانی فراخوانی می شود که Angular تغییر در مقدار یا پارامترهای ارسال شده به یک لوله را تشخیص دهد. به عنوان مثال، هرگونه تغییر در یک مقدار ورودی اولیه (رشته، عدد، بولی، نماد) یا یک مرجع شی تغییر یافته (تاریخ، آرایه، تابع، شی). یک لوله ناخالص برای هر چرخه تشخیص تغییر بدون توجه به تغییر مقدار یا پارامترها فراخوانی می شود. به عنوان مثال، یک لوله ناخالص اغلب، به اندازه هر ضربه کلید یا حرکت ماوس، نامیده می شود.
- +هر برنامه حداقل یک ماژول Angular دارد، ماژول ریشه ای که برای راه اندازی برنامه بوت استرپ می کنید ماژول بوت استرپینگ نامیده می شود. معمولاً به عنوان AppModule شناخته می شود. ساختار پیش فرض AppModule تولید شده توسط AngularCLI به شرح زیر است:
/* JavaScript imports */ @@ -2088,15 +2329,15 @@- +منظور از botstrapping module h }) export class AppModule { }
مشاهده پذیرها بیانی هستند که از ارسال پیام بین ناشران و مشترکین در برنامه شما پشتیبانی می کنند. آنها عمدتاً برای مدیریت رویداد، برنامه نویسی ناهمزمان و مدیریت چندین مقدار استفاده می شوند. در این مورد، شما تابعی را برای انتشار مقادیر تعریف می کنید، اما تا زمانی که یک مصرف کننده در آن مشترک نشود، اجرا نمی شود. سپس مصرف کننده مشترک تا زمانی که عملکرد کامل شود یا تا زمانی که اشتراک خود را لغو نکند، اعلان ها را دریافت می کند.
- +اکثر برنامه های کاربردی Front-end با استفاده از رابط XMLHttpRequest یا fetch() API از طریق پروتکل HTTP با سرویس های پشتیبان ارتباط برقرار می کنند. Angular یک API HTTP کلاینت ساده شده به نام HttpClient را ارائه می دهد که بر پایه رابط XMLHttpRequest است. این سرویس گیرنده از بسته «@angular/common/http» در دسترس است.
می توانید در ماژول ریشه خود به صورت زیر وارد کنید،
مزایای اصلی HttpClient را می توان به شرح زیر ذکر کرد:
دارای ویژگی های تست پذیری است
اشیاء درخواست و پاسخ تایپ شده را ارائه می دهد
رهگیری درخواست و پاسخ
از API های Observalbe پشتیبانی می کند
از مدیریت خطای ساده پشتیبانی می کند
در زیر مراحلی که برای استفاده از HttpClient باید طی شود آورده شده است.
HttpClient را به ماژول root وارد کنید:
import { HttpClientModule } from '@angular/common/http'; @@ -2164,10 +2405,10 @@چطوری از HttpClient اس }
از آنجایی که روش سرویس فوق یک Observable را برمی گرداند که باید در کامپوننت ثبت شود.
- +ممکن است بدنه پاسخ دادههای پاسخ کامل را برنگرداند زیرا گاهی اوقات سرورها سرصفحهها یا کد وضعیت خاصی را که برای گردش کار برنامه مهم هستند، برمیگردانند. برای دریافت پاسخ کامل، باید از گزینه Observer از HttpClient استفاده کنید.
getUserResponse(): Observable<HttpResponse<User>> { @@ -2176,10 +2417,10 @@چطوری response ها رو & }
اکنون متد HttpClient.get () یک Observable از HttpResponse تایپ شده را به جای داده های JSON برمی گرداند.
- +اگر درخواست در سرور ناموفق باشد یا به دلیل مشکلات شبکه به سرور نرسد، HttpClient به جای پاسخ موفقیت آمیز، یک شی خطا را برمی گرداند. در این مورد، باید با ارسال شیء خطا به عنوان متد ()subscribe، کامپوننت را کنترل کنید.
بیایید ببینیم که چگونه می توان آن را در کامپوننت با یک مثال مدیریت کرد،
@@ -2192,20 +2433,20 @@It is always a good idea to give the user some meaningful feedback instead of displaying the raw error object returned from HttpClient.
- +RxJS کتابخانه ای برای نوشتن کدهای ناهمزمان و مبتنی بر تماس به سبک عملکردی و واکنشی با استفاده از Observables است. بسیاری از APIها مانند HttpClient RxJS Observables را تولید و مصرف می کنند و همچنین از عملگرها برای پردازش مشاهده پذیرها استفاده می کنند.
به عنوان مثال، می توانید مشاهده پذیرها و عملگرها را برای استفاده از HttpClient به صورت زیر وارد کنید.
import { Observable, throwError } from 'rxjs';
import { catchError, retry } from 'rxjs/operators';
-
+
یک نمونه قابل مشاهده تنها زمانی شروع به انتشار مقادیر می کند که شخصی در آن مشترک شود. بنابراین باید با فراخوانی متد subscribe() از نمونه، مشترک شوید و یک شی ناظر را برای دریافت اعلانها ارسال کنید.
بیایید نمونهای از ایجاد و اشتراک در یک مشاهدهپذیر ساده، با مشاهدهگری که پیام دریافتشده را در کنسول ثبت میکند، در نظر بگیریم.
@@ -2228,10 +2469,10 @@Observable یک شی منحصر به فرد شبیه به Promise است که می تواند به مدیریت کدهای همگام کمک کند. Observable ها بخشی از زبان جاوا اسکریپت نیستند، بنابراین باید به یک کتابخانه معروف Observable به نام RxJS تکیه کنیم.
مشاهده پذیرها با استفاده از کلمه کلیدی جدید ایجاد می شوند.
مثال ساده قابل مشاهده را ببینید،
@@ -2244,10 +2485,10 @@Observer یک رابط برای مصرف کننده اعلان های مبتنی بر فشار است که توسط Observable ارائه می شود. دارای ساختار زیر است،
interface Observer<T> {
@@ -2262,10 +2503,10 @@ observer جیه؟
myObservable.subscribe(myObserver);
Note: اگر یک کنترل کننده برای یک نوع اعلان ارائه نکنید، ناظر اعلان های آن نوع را نادیده می گیرد.
- +در زیر لیستی از تفاوت های بین وعده و قابل مشاهده است،
پخش چندگانه، عمل پخش به فهرستی از چند مشترک در یک اجرا است.
بیایید ویژگی چند ریختگی را نشان دهیم،
@@ -2314,10 +2555,10 @@شما میتوانید با تعیین یک بازخوانی خطا روی ناظر به جای تکیه بر try/catch که در محیط ناهمزمان بیاثر هستند، خطاها را مدیریت کنید.
به عنوان مثال، می توانید خطا را به صورت زیر تعریف کنید.
@@ -2326,10 +2567,10 @@متد subscribe () میتواند تعاریف تابع برگشتی را بهصورت خطی بپذیرد، برای کنترلکنندههای بعدی، خطا و کامل به عنوان نماد دست کوتاه یا متد Subscribe با آرگومانهای موقعیتی شناخته میشود.
به عنوان مثال، می توانید متد subscribe را به صورت زیر تعریف کنید.
@@ -2339,25 +2580,25 @@کتابخانه RxJS همچنین توابع کاربردی زیر را برای ایجاد و کار با مشاهده پذیرها ارائه می دهد.
تبدیل کدهای موجود برای عملیات همگام به قابل مشاهده
تکرار از طریق مقادیر در یک جریان
نگاشت مقادیر به انواع مختلف
فیلتر کردن جریان ها
آهنگسازی چند جریان
RxJS توابع ایجاد را برای فرآیند ایجاد قابل مشاهده از چیزهایی مانند وعده ها، رویدادها، تایمرها و درخواست های Ajax فراهم می کند. اجازه دهید هر یک از آنها را با یک مثال توضیح دهیم،
از قول یک قابل مشاهده ایجاد کنید
import { from } from 'rxjs'; // from function @@ -2369,7 +2610,7 @@توابع سازندd });
Create an observable that creates an AJAX request
import { ajax } from 'rxjs/ajax'; // ajax function @@ -2378,7 +2619,7 @@توابع سازندd apiData.subscribe(res => console.log(res.status, res.response));
یک قابل مشاهده از یک شمارنده ایجاد کنید
import { interval } from 'rxjs'; // interval function @@ -2388,7 +2629,7 @@توابع سازندd ));
یک قابل مشاهده از یک رویداد ایجاد کنید
import { fromEvent } from 'rxjs'; @@ -2398,20 +2639,20 @@- +توابع سازندd console.log(`Coordnitaes of mouse pointer: ${e.clientX} * ${e.clientY}`); });
به طور معمول یک شی ناظر می تواند هر ترکیبی از کنترل کننده های نوع اعلان بعدی، خطا و کامل را تعریف کند. اگر یک کنترل کننده برای یک نوع اعلان ارائه نکنید، ناظر فقط اعلان های آن نوع را نادیده می گیرد.
- +عناصر زاویهای، اجزای زاویهای هستند که بهعنوان عناصر سفارشی (یک استاندارد وب برای تعریف عناصر جدید HTML به روشی فریمورک-آگنوستیک) بستهبندی شدهاند. Angular Elements میزبان یک کامپوننت Angular است که پلی بین داده ها و منطق تعریف شده در کامپوننت و APIهای استاندارد DOM ایجاد می کند، بنابراین راهی برای استفاده از مولفه های Angular در "محیط های غیر زاویه ای" ارائه می دهد.
- +از آنجایی که عناصر Angular به عنوان عناصر سفارشی بسته بندی می شوند، پشتیبانی مرورگر از عناصر زاویه ای مانند پشتیبانی از عناصر سفارشی است.
این ویژگی در حال حاضر به صورت بومی در تعدادی از مرورگرها پشتیبانی میشود و برای مرورگرهای دیگر در انتظار است.
عناصر سفارشی (یا اجزای وب) یک ویژگی پلتفرم وب هستند که HTML را با اجازه دادن به شما برای تعریف برچسبی که محتوای آن توسط کد جاوا اسکریپت ایجاد و کنترل می شود، گسترش می دهد. مرورگر یک «CustomElementRegistry» از عناصر سفارشی تعریف شده را حفظ می کند، که یک کلاس جاوا اسکریپت غیر قابل مشاهده را به یک تگ HTML نگاشت می کند. در حال حاضر این ویژگی توسط کروم، فایرفاکس، اپرا و سافاری پشتیبانی میشود و در مرورگرهای دیگر از طریق polyfills در دسترس است.
- +خیر، عناصر سفارشی هنگامی که به DOM اضافه می شوند به طور خودکار راه اندازی می شوند (یا شروع می شوند) و وقتی از DOM حذف می شوند به طور خودکار از بین می روند. هنگامی که یک عنصر سفارشی برای هر صفحه ای به DOM اضافه می شود، مانند هر عنصر HTML دیگری به نظر می رسد و رفتار می کند و به دانش خاصی از Angular نیاز ندارد.
- +در زیر مراحل به ترتیب در مورد عملکرد عناصر سفارشی آمده است،
App registers custom element with browser: از تابع «createCustomElement()» برای تبدیل یک مؤلفه به کلاسی استفاده کنید که میتواند در مرورگر به عنوان یک عنصر سفارشی ثبت شود.
App adds custom element to DOM: عنصر سفارشی را درست مانند یک عنصر HTML داخلی مستقیماً به DOM اضافه کنید.
Browser instantiate component based class: مرورگر یک نمونه از کلاس ثبت شده ایجاد می کند و آن را به DOM اضافه می کند.
تبدیل اجزا به عناصر سفارشی شامل دو مرحله اصلی است،
کلاس عنصر سفارشی بسازید: Angular تابع "createCustomElement()" را برای تبدیل یک جزء Angular (همراه با وابستگی های آن) به یک عنصر سفارشی ارائه می دهد. فرآیند تبدیل رابط «NgElementConstructor» را پیادهسازی میکند و یک کلاس سازنده ایجاد میکند که برای تولید یک نمونه self-bootstrapping از مؤلفه Angular استفاده میشود.
** ثبت کلاس عنصر با مرورگر:** از تابع JS «customElements.define()» برای ثبت سازنده پیکربندی شده و تگ عنصر سفارشی مرتبط با آن با «CustomElementRegistry» مرورگر استفاده می کند. هنگامی که مرورگر با برچسب عنصر ثبت شده روبرو می شود، از سازنده برای ایجاد یک نمونه عنصر سفارشی استفاده می کند.
The detailed structure would be as follows,
ویژگی های Component و منطق مستقیماً به ویژگی های HTML و سیستم رویداد مرورگر نگاشت می شوند. اجازه دهید آنها را در دو مرحله توصیف کنیم،
CreateCustomElement() API خصوصیات ورودی کامپوننت را با ویژگی های مربوط به عنصر سفارشی تجزیه می کند. به عنوان مثال، جزء @Input('myInputProp') به عنوان ویژگی عنصر سفارشی 'my-input-prop' تبدیل شد.
خروجی های کامپوننت به صورت رویدادهای سفارشی HTML ارسال می شوند که نام رویداد سفارشی با نام خروجی مطابقت دارد. برای مثال، کامپوننت @Output() valueChanged = New EventEmitter() به عنوان عنصر سفارشی با رویداد اعزام به عنوان "valueChanged" تبدیل شده است.
میتوانید از انواع «NgElement» و «WithProperties» که از @angular/elements صادر شدهاند استفاده کنید.
بیایید ببینیم که چگونه می توان آن را با مقایسه با کامپوننت Angular اعمال کرد.
ظرف ساده با ویژگی ورودی به صورت زیر خواهد بود.
@Component(...)
@@ -2503,7 +2744,7 @@ چطوری تایپ ه
}
پس از اعمال typescript مقدار ورودی و انواع آنها را تأیید می کند.
const container = document.createElement('my-container') as NgElement & WithProperties<{message: string}>;
@@ -2511,33 +2752,33 @@ چطوری تایپ ه
container.message = true; // <-- ERROR: TypeScript knows this should be a string.
container.greet = 'News'; // <-- ERROR: TypeScript knows there is no `greet` property on `container`.
-
+
مؤلفههای پویا مؤلفههایی هستند که مکان مؤلفهها در برنامه در زمان ساخت تعریف نشده است، یعنی در هیچ قالب زاویهای استفاده نمیشوند. اما کامپوننت نمونه سازی می شود و در زمان اجرا در برنامه قرار می گیرد.
- +عمدتاً سه نوع دستورالعمل وجود دارد:
** مؤلفه ها ** - این دستورالعمل ها دارای یک الگو هستند.
دستورالعمل های ساختاری — این دستورالعمل ها با افزودن و حذف عناصر DOM، طرح DOM را تغییر می دهند.
دستورالعمل های ویژگی - این دستورالعمل ها ظاهر یا رفتار یک عنصر، جزء یا دستورالعمل دیگر را تغییر می دهند.
میتوانید از دستور CLI «ng generate directive» برای ایجاد فایل کلاس دستورالعمل استفاده کنید. فایل منبع (src/app/components/directivename.directive.ts
)، فایل آزمایشی مربوطه (.spec.ts) را ایجاد می کند و فایل کلاس دستورالعمل را در ماژول ریشه اعلام می کند.
بیایید رفتار ساده برجسته کننده را به عنوان یک دستورالعمل مثال برای عنصر DOM در نظر بگیریم. می توانید دستورالعمل ویژگی را با استفاده از مراحل زیر ایجاد و اعمال کنید:
کلاس HighlightDirective با نام فایل «src/app/highlight.directive.ts» ایجاد کنید. در این فایل، باید Directive را از کتابخانه هسته وارد کنیم تا متادیتا را اعمال کنیم و ElementRef را در سازنده دستورالعمل برای تزریق یک مرجع به عنصر DOM میزبان وارد کنیم.
import { Directive, ElementRef } from '@angular/core'; @@ -2552,51 +2793,51 @@یه مثال از اس }
)
دستورالعمل ویژگی را به عنوان یک ویژگی در عنصر میزبان اعمال کنید (به عنوان مثال،
)
<p appHighlight>Highlight me!</p>
برای مشاهده رفتار برجسته در عنصر پاراگراف، برنامه را اجرا کنید
ng serve
-
+
روتر زاویه ای مکانیزمی است که در آن هنگام انجام وظایف برنامه توسط کاربران، ناوبری از یک نمای به نمای بعدی انجام می شود. مفاهیم یا مدل ناوبری برنامه مرورگر را به عاریت گرفته است.
- +برنامه مسیریابی باید عنصر
<base href="/">
-
+
Angular Router که نمایانگر یک کامپوننت خاص برای یک URL معین است، بخشی از Angular Core نیست. در کتابخانه ای به نام «@angular/router» برای وارد کردن اجزای مورد نیاز روتر موجود است. به عنوان مثال، ما آنها را در ماژول برنامه مانند زیر وارد می کنیم.
import { RouterModule, Routes } from '@angular/router';
-
+
RouterOutlet یک دستورالعمل از کتابخانه روتر است و به عنوان یک مکان نگهدار عمل می کند که نقطه ای را در قالب مشخص می کند که روتر باید اجزای آن خروجی را نمایش دهد. خروجی روتر مانند یک جزء استفاده می شود،
<router-outlet></router-outlet> <!-- Routed components go here -->- +
RouterLink یک دستورالعمل در تگ های لنگر است که به روتر کنترل آن عناصر را می دهد. از آنجایی که مسیرهای ناوبری ثابت هستند، می توانید مقادیر رشته ای را به دستورالعمل پیوند مسیریاب به صورت زیر اختصاص دهید.
<h1>Angular Router</h1> @@ -2606,10 +2847,10 @@- +router link ها چیا هستن </nav> <router-outlet></router-outlet>
RouterLinkActive دستورالعملی است که کلاسهای css را برای اتصالات فعال RouterLink بر اساس RouterState فعلی تغییر میدهد. به عنوان مثال، روتر کلاس های CSS را زمانی که این پیوند فعال است اضافه می کند و زمانی که پیوند غیر فعال است حذف می کند. به عنوان مثال، می توانید آنها را مانند زیر به RouterLinks اضافه کنید.
<h1>Angular Router</h1> @@ -2619,10 +2860,10 @@- +منظور از منظ </nav> <router-outlet></router-outlet>
RouterState درختی از مسیرهای فعال شده است. هر گره در این درخت از بخش های URL "مصرف شده"، پارامترهای استخراج شده و داده های حل شده می داند. با استفاده از «سرویس روتر» و ویژگی «routerState» میتوانید از هر کجای برنامه به RouterState فعلی دسترسی داشته باشید.
@Component({templateUrl:'template.html'})
@@ -2636,7 +2877,7 @@ What is router state?
}
}
-
+
event های مربوط به router چیا هستن؟events?
@@ -2665,7 +2906,7 @@ActivatedRoute حاوی اطلاعاتی در مورد یک مسیر مرتبط با یک جزء بارگذاری شده در یک خروجی است. همچنین می توان از آن برای عبور از درخت حالت روتر استفاده کرد. ActivatedRoute به عنوان یک سرویس روتر برای دسترسی به اطلاعات تزریق می شود. در مثال زیر می توانید به مسیر و پارامترهای مسیر دسترسی داشته باشید.
@Component({...})
@@ -2678,10 +2919,10 @@ منظور از activated route چ
}
}
-
+
یک روتر باید با لیستی از تعاریف مسیر پیکربندی شود. شما روتر را با مسیرها از طریق روش «RouterModule.forRoot()» پیکربندی میکنید و نتیجه را به آرایه «واردات» AppModule اضافه میکنید.
const appRoutes: Routes = [ @@ -2711,103 +2952,103 @@- +چطوری router های پ }) export class AppModule { }
اگر URL با هیچ یک از مسیرهای از پیش تعریف شده مطابقت نداشته باشد، باعث می شود روتر خطایی ایجاد کند و برنامه را خراب کند. در این حالت می توانید از مسیر wildcard استفاده کنید. یک مسیر عام دارای یک مسیر متشکل از دو ستاره برای مطابقت با هر URL است.
به عنوان مثال، شما می توانید PageNotFoundComponent را برای مسیر wildcard به صورت زیر تعریف کنید
{ path: '**', component: PageNotFoundComponent }
-
+
نه، ماژول مسیریابی یک انتخاب طراحی است. وقتی پیکربندی ساده است، میتوانید از ماژول مسیریابی (مثلاً AppRoutingModule) صرفنظر کنید و پیکربندی مسیریابی را مستقیماً در ماژول همراه (مثلاً AppModule) ادغام کنید. اما زمانی توصیه می شود که پیکربندی پیچیده باشد و شامل خدمات تخصصی نگهبان و حل کننده باشد.
- +Angular Universal یک ماژول رندر سمت سرور برای برنامه های Angular در سناریوهای مختلف است. این یک پروژه جامعه محور است و در بسته @angular/platform-server موجود است. اخیرا Angular Universal با Angular CLI ادغام شده است.
- +Angular دو راه برای کامپایل برنامه شما ارائه می دهد.
به موقع (JIT)
پیش از زمان (AOT)
Just-in-Time (JIT) نوعی کامپایل است که برنامه شما را در زمان اجرا در مرورگر کامپایل می کند. هنگامی که دستورات CLI ng build (فقط ساخت) یا ng serve (ساخت و ارائه به صورت محلی) را اجرا می کنید، کامپایل JIT پیش فرض است. به عنوان مثال، دستورات زیر برای کامپایل JIT استفاده می شود،
ng build
ng serve
-
+
Ahead-of-Time (AOT) نوعی کامپایل است که برنامه شما را در زمان ساخت کامپایل می کند. برای کامپایل AOT، گزینه «--aot» را با دستور ng build یا ng serve به شرح زیر اضافه کنید.
ng build --aot
ng serve --aot
نکته: دستور ng build با --prod meta-flag ('ng build --prod') به طور پیش فرض با AOT کامپایل می شود.
- +کامپوننت ها و قالب های Angular را نمی توان مستقیماً توسط مرورگر درک کرد. به همین دلیل برنامه های Angular قبل از اینکه بتوانند در مرورگر اجرا شوند نیاز به یک فرآیند کامپایل دارند. برای مثال، در کامپایل AOT، هر دو کد Angular HTML و TypeScript در مرحله ساخت قبل از اجرای مرورگر به کد جاوا اسکریپت کارآمد تبدیل میشوند.
- +** رندر سریعتر: ** مرورگر یک نسخه از پیش کامپایل شده برنامه را دانلود می کند. بنابراین می تواند برنامه را بلافاصله بدون کامپایل کردن برنامه رندر کند.
** درخواست های ناهمزمان کمتر: ** قالب های HTML خارجی و برگه های سبک CSS را در برنامه جاوا اسکریپت قرار می دهد که درخواست های جداگانه ajax را حذف می کند.
اندازه دانلود فریمورک Angular کوچکتر: نیازی به دانلود کامپایلر Angular ندارد. از این رو به طور چشمگیری حجم برنامه را کاهش می دهد.
تشخیص خطاهای قالب زودتر: خطاهای اتصال قالب را در مرحله ساخت خود شناسایی و گزارش می کند.
امنیت بهتر: قالب ها و اجزای HTML را در جاوا اسکریپت کامپایل می کند. بنابراین هیچ حمله تزریقی وجود نخواهد داشت.
شما می توانید کامپایل برنامه خود را به دو روش کنترل کنید،
tsconfig.json
با ارائه گزینه های کامپایلر قالب در فایل tsconfig.json
با پیکربندی فراداده Angular با دکوراتورها
در Angular، شما باید ابرداده را با محدودیت های کلی زیر بنویسید:
نحو عبارت را با در محدوده پشتیبانی شده از ویژگی های جاوا اسکریپت بنویسید
کامپایلر فقط می تواند به نمادهایی که صادر شده اند ارجاع دهد
فقط توابع پشتیبانی شده توسط کامپایلر را فراخوانی کنید
اعضای کلاس تزئین شده و محدود به داده ها باید عمومی باشند.
کامپایلر AOT در سه فاز کار می کند،
تحلیل کد: کامپایلر نمایشی از منبع را ثبت می کند
تولید کد: تفسیر را کنترل می کند و همچنین محدودیت هایی را در مورد آنچه تفسیر می کند ایجاد می کند.
** اعتبار سنجی: ** در این مرحله، کامپایلر الگوی Angular از کامپایلر TypeScript برای اعتبارسنجی عبارات الزام آور در قالب ها استفاده می کند.
خیر، توابع پیکان یا توابع لامبدا را نمی توان برای تخصیص مقادیر به ویژگی های دکوراتور استفاده کرد. به عنوان مثال، قطعه زیر نامعتبر است:
@Component({
@@ -2830,20 +3071,20 @@ ما میتونیم ا
اگر همچنان از تابع arrow استفاده می کنید، یک گره خطا به جای تابع ایجاد می کند. وقتی کامپایلر بعداً این گره را تفسیر میکند، یک خطا گزارش میکند تا تابع فلش را به یک تابع صادر شده تبدیل کند.
نکته: از Angular5 به بعد، کامپایلر به طور خودکار این بازنویسی را در حین انتشار فایل js. انجام می دهد.
فایل metadata.json را میتوان بهعنوان نموداری از ساختار کلی فرادادههای تزئینگر، که بهعنوان یک درخت نحو انتزاعی (AST) نشان داده میشود، در نظر گرفت. در طول مرحله تجزیه و تحلیل، جمعآورنده AOT ابردادههای ثبتشده در تزئینات Angular را اسکن میکند و اطلاعات فراداده را در فایلهای .metadata.json، یک عدد برای هر فایل .d.ts، خروجی میدهد.
- +خیر، گردآورنده AOT زیرمجموعه ای از (یا محدود) ویژگی های جاوا اسکریپت را درک می کند. اگر عبارتی از نحو پشتیبانی نشده استفاده کند، گردآورنده یک گره خطا در فایل .metadata.json می نویسد. بعداً، کامپایلر در صورتی که برای تولید کد برنامه به آن تکه متادیتا نیاز داشته باشد، خطایی را گزارش میکند.
- +کامپایلر فقط می تواند ارجاعات به نمادهای صادر شده در ابرداده را حل کند. جایی که برخی از اعضای غیرصادراتی هنگام تولید کد تا می شوند. i.e Folding فرآیندی است که در آن گردآورنده یک عبارت را در حین جمع آوری ارزیابی می کند و نتیجه را به جای عبارت اصلی در .metadata.json ثبت می کند.
به عنوان مثال، کامپایلر نمی تواند مرجع انتخابگر را ارجاع دهد زیرا صادر نشده است
به یاد داشته باشید که کامپایلر نمی تواند همه چیز را تا کند. به عنوان مثال، عملگر گسترش بر روی آرایه ها، اشیاء ایجاد شده با استفاده از کلمات کلیدی جدید و فراخوانی تابع.
- +کامپایلر AOT از ماکروها به شکل توابع یا متدهای ایستا پشتیبانی می کند که عبارتی را در یک عبارت بازگشتی واحد برمی گرداند.
به عنوان مثال، یک تابع ماکرو زیر را در نظر بگیرید،
** فراخوانی تابع پشتیبانی نمی شود: ** کامپایلر در حال حاضر از عبارات تابع یا توابع لامبدا پشتیبانی نمی کند. برای مثال، نمیتوانید useFactory ارائهدهنده را روی یک تابع ناشناس یا تابع فلش مانند زیر تنظیم کنید.
providers: [ @@ -2940,7 +3181,7 @@چن تا مثال از ]
متغیر تخریب شده یا ثابت پشتیبانی نمی شود: کامپایلر ارجاع به متغیرهای اختصاص داده شده توسط ساختارشکنی را پشتیبانی نمی کند. به عنوان مثال، شما نمی توانید چیزی شبیه به این بنویسید:
import { user } from './user'; @@ -2962,15 +3203,15 @@-چن تا مثال از {provide: Age, useValue: user.age}, ]
بازنویسی متادیتا فرآیندی است که در آن کامپایلر عبارتی را که فیلدهایی مانند useClass، useValue، useFactory و داده را مقداردهی اولیه می کند، به یک متغیر صادر شده تبدیل می کند که جایگزین عبارت می شود. به یاد داشته باشید که کامپایلر این بازنویسی را در حین انتشار فایل js انجام می دهد اما در فایل های تعریف (فایل .d.ts) این کار را انجام نمی دهد.
- +Angular Compiler از وراثت پیکربندی از طریق Extend در tsconfig.json در angularCompilerOptions پشتیبانی می کند. به عنوان مثال، پیکربندی از فایل پایه (به عنوان مثال، tsconfig.base.json) ابتدا بارگیری می شود، سپس توسط آنهایی که در فایل پیکربندی ارثی هستند، لغو می شوند.
{ @@ -2986,10 +3227,10 @@- +How do you provide configuration inheritance?
} }
گزینه های کامپایلر قالب زاویه ای به عنوان اعضای شی angularCompilerOptions در فایل tsconfig.json مشخص شده اند. این گزینه ها در مجاورت گزینه های کامپایلر typescript مشخص می شوند.
{ @@ -3004,10 +3245,10 @@- +How do you specify angular template compiler options?
} }
شما می توانید صریحاً با افزودن گزینه کامپایلر fullTemplateTypeCheck در "angularCompilerOptions" tsconfig.json پروژه، اعتبار سنجی عبارت binding را فعال کنید. هنگامی که یک خطای نوع در عبارت اتصال الگو تشخیص داده می شود، پیام های خطا تولید می کند.
برای مثال، جزء زیر را در نظر بگیرید:
@@ -3023,10 +3264,10 @@my.component.ts.MyComponent.html(1,1): : Property 'contacts' does not exist on type 'User'. Did you mean 'contact'?
-
+
می توانید بررسی نوع عبارت binding را با استفاده از تابع cast نوع $any() غیرفعال کنید (با احاطه کردن عبارت). در مثال زیر، خطای Property contacts does not exist با فرستادن کاربر به هر نوع سرکوب شده است.
template: '{{ $any(user).contacts.email }}' @@ -3035,10 +3276,10 @@What is the purpose of any type cast function?
template: '{{ $any(this).contacts.email }}'- +
برای سرکوب خطای Object is assibly 'undefined' می توانید از عملگر اظهاری نوع غیر تهی استفاده کنید. در مثال زیر، ویژگی های کاربر و مخاطب همیشه با هم تنظیم می شوند، به این معنی که اگر کاربر غیر تهی باشد، مخاطب همیشه غیر تهی است. خطا در مثال با استفاده از contact!.email سرکوب شده است.
@Component({ @@ -3055,10 +3296,10 @@- +What is Non null type assertion operator?
} }
عبارت مورد استفاده در یک دستورالعمل ngIf برای محدود کردن اتحادیه های نوع در کامپایلر الگوی Angular مشابه عبارت if در تایپ اسکریپت استفاده می شود. بنابراین *ngIf به کامپایلر typeScript اجازه می دهد استنباط کند که داده های مورد استفاده در عبارت binding هرگز تعریف نشده نخواهد بود.
@Component({ @@ -3069,47 +3310,47 @@- +What is type narrowing?
user?: User; }
بخش وابستگی های package.json با در یک برنامه زاویه ای را می توان به صورت زیر تقسیم کرد:
** بسته های زاویه ای: ** هسته زاویه ای و ماژول های اختیاری. نام بسته آنها @angular/ شروع می شود.
بسته های پشتیبانی: کتابخانه های شخص ثالثی که برای اجرای برنامه های Angular باید وجود داشته باشند.
** بسته های Polyfill: ** Polyfill شکاف ها را در پیاده سازی جاوا اسکریپت مرورگر وصل می کند.
Zone یک زمینه اجرایی است که در تمام وظایف ناهمگام باقی می ماند. هنگامی که عملیات جاوا اسکریپت بومی رویدادها را افزایش می دهد، Angular برای اجرای فرآیندهای تشخیص تغییر Angular به zone.js متکی است.
- +خدمات، لولهها و دستورالعملهای مورد نیاز معمولاً توسط ماژول @angular/common ارائه شده است. جدا از این HttpClientModule در زیر angular/common/http@ موجود است.
- +Codelyzer مجموعه ای از قوانین tslint را برای تجزیه و تحلیل کد استاتیک پروژه های Angular TypeScript ارائه می دهد. می توانید تحلیلگر کد استاتیک را روی برنامه های وب، NativeScript، Ionic و غیره اجرا کنید. Angular CLI از این پشتیبانی می کند و می توان از آن به صورت زیر استفاده کرد.
ng new codelyzer ng lint- +
سیستم انیمیشن Angular بر اساس عملکرد CSS ساخته شده است تا هر خاصیتی را که مرورگر آن را قابل انیمیشن می داند، متحرک کند. این ویژگیها شامل موقعیتها، اندازهها، تبدیلها، رنگها، حاشیهها و غیره است. ماژولهای Angular برای انیمیشنها @angular/animations و @angular/platform-browser هستند و این وابستگیها به طور خودکار به پروژه شما اضافه میشوند. شما یک پروژه با استفاده از Angular CLI ایجاد می کنید.
- +برای پیاده سازی انیمیشن در پروژه زاویه ای خود باید مراحل زیر را دنبال کنید.
**Enabling the animations module:**BrowserAnimationsModule را وارد کنید تا قابلیتهای انیمیشن را به ماژول برنامه Angular root خود اضافه کنید (به عنوان مثال، src/app/app.module.ts).
import { NgModule } from '@angular/core'; @@ -3127,7 +3368,7 @@What are the steps to use animation module?
export class AppModule { }
Importing animation functions into component files: توابع انیمیشن مورد نیاز را از @angular/animations در فایلهای مؤلفه وارد کنید (به عنوان مثال، src/app/app.component.ts).
import { @@ -3140,7 +3381,7 @@What are the steps to use animation module?
} from '@angular/animations';
Adding the animation metadata property: یک ویژگی ابرداده به نام animations اضافه کنید: در دکوراتور @Component() در فایل های کامپوننت (به عنوان مثال src/app/app.component.ts)
@Component({
@@ -3152,10 +3393,10 @@ What are the steps to use animation module?
]
})
-
+
تابع state() Angular برای تعریف حالت های مختلف برای فراخوانی در پایان هر انتقال استفاده می شود. این تابع دو آرگومان می گیرد: یک نام منحصر به فرد مانند open یا بسته و یک تابع style().
به عنوان مثال، می توانید یک تابع حالت باز بنویسید
@@ -3165,10 +3406,10 @@تابع style برای تعریف مجموعهای از سبکها برای مرتبط کردن با یک نام وضعیت استفاده میشود. برای تنظیم ویژگی های سبک CSS باید از آن به همراه تابع state() استفاده کنید. به عنوان مثال، در حالت بسته، دکمه دارای ارتفاع 100 پیکسل، کدورت 0.8 و رنگ زمینه سبز است.
state('close', style({
@@ -3178,10 +3419,10 @@ What is Style function?
})),
نکته: The style attributes must be in camelCase.
- +انیمیشنهای Angular روشی قدرتمند برای پیادهسازی انیمیشنهای پیچیده و قانعکننده برای اپلیکیشن وب تک صفحهای Angular شما هستند.
import { Component, OnInit, Input } from '@angular/core';
@@ -3222,10 +3463,10 @@ What is the purpose of animate function?
}
}
-
+
تابع انتقال انیمیشن برای تعیین تغییراتی که بین یک حالت و حالت دیگر در یک دوره زمانی رخ می دهد استفاده می شود. دو آرگومان را می پذیرد: آرگومان اول عبارتی را می پذیرد که جهت بین دو حالت گذار را مشخص می کند و آرگومان دوم تابع animate() را می پذیرد.
بیایید یک مثال انتقال حالت از باز به بسته با انتقال نیم ثانیه بین حالت ها را در نظر بگیریم.
@@ -3233,10 +3474,10 @@با استفاده از DomSanitizer میتوانیم Html، Style، Script، Url پویا را تزریق کنیم.
</span>
import { Component, OnInit } from '@angular/core';
@@ -3252,26 +3493,26 @@ How to inject the dynamic script in angular?
htmlSnippet: string = this.sanitizer.bypassSecurityTrustScript("<script>safeCode()</script>");
}
-
+
Service Worker یک اسکریپت است که در مرورگر وب اجرا می شود و حافظه پنهان یک برنامه را مدیریت می کند. با شروع از نسخه 5.0.0، Angular با یک سرویس کارگر ارائه می شود. Angular service worker برای بهینه سازی تجربه کاربر نهایی از استفاده از یک برنامه کاربردی از طریق اتصال شبکه کند یا غیرقابل اعتماد طراحی شده است، در حالی که خطرات ارائه محتوای قدیمی را نیز به حداقل می رساند.
- +یک برنامه را مانند نصب یک برنامه بومی کش می کند
یک برنامه در حال اجرا با همان نسخه از همه فایل ها بدون هیچ فایل ناسازگاری به کار خود ادامه می دهد
هنگامی که برنامه را به روز می کنید، آخرین نسخه کاملاً کش شده را بارگیری می کند
هنگامی که تغییرات منتشر می شود، بلافاصله در پس زمینه به روز می شود
Service Workers پهنای باند را با بارگیری منابع صرفه جویی می کند که فقط زمانی که آنها تغییر کرده اند.
تزریق وابستگی یک جزء مشترک در AngularJS و Angular است، اما تفاوتهای کلیدی بین این دو فریمورک در نحوه عملکرد واقعی آن وجود دارد.
Angular Ivy یک موتور رندر جدید برای Angular است. میتوانید نسخه پیشنمایش Ivy را از نسخه 8 Angular انتخاب کنید.
با استفاده از پرچم --enable-ivy با دستور ng new می توانید ivy را در یک پروژه جدید فعال کنید
ng new ivy-demo-app --enable-ivy
میتوانید با افزودن گزینه «enableIvy» در «angularCompilerOptions» در «tsconfig.app.json» پروژه خود، آن را به یک پروژه موجود اضافه کنید.
{ @@ -3313,21 +3554,21 @@- +What is Angular Ivy?
} }
می توانید با پیش نمایش Ivy انتظار ویژگی های زیر را داشته باشید.
کد تولید شده که خواندن و اشکال زدایی آن در زمان اجرا آسان تر است
زمان بازسازی سریعتر
بهبود اندازه محموله
بررسی نوع قالب بهبود یافته است
بله، این یک پیکربندی توصیه شده است. همچنین، کامپایل AOT با Ivy سریعتر است. بنابراین باید گزینه های ساخت پیش فرض (با در angular.json) را برای پروژه خود تنظیم کنید تا همیشه از کامپایل AOT استفاده کند.
{
@@ -3345,15 +3586,15 @@ Can I use AOT compilation with Ivy?
}
}
-
+
سرویس زبان Angular راهی برای دریافت تکمیل، خطا، نکات و پیمایش در قالبهای Angular شما است، چه خارجی در یک فایل HTML باشند و چه در حاشیهنویسی/تزیینات در یک رشته تعبیه شده باشند. این قابلیت را دارد که به طور خودکار تشخیص دهد که شما در حال باز کردن یک فایل Angular هستید، فایل tsconfig.json شما را می خواند، تمام الگوهایی را که در برنامه خود دارید پیدا می کند و سپس تمام خدمات زبان را ارائه می دهد.
- +با دستور npm زیر می توانید Angular Language Service را در پروژه خود نصب کنید.
npm install --save-dev @angular/language-service
@@ -3365,15 +3606,15 @@ How do you install angular language service in the project?
]
نکته: خدمات تکمیل و تشخیص فقط برای فایل های .ts کار می کند. برای پشتیبانی از فایل های HTML باید از افزونه های سفارشی استفاده کنید.
- +بله، سرویس زبان Angular در حال حاضر برای Visual Studio Code و WebStorm IDE در دسترس است. شما باید سرویس زبان زاویه ای را با استفاده از افزونه و devDependency نصب کنید. در ویرایشگر sublime، باید تایپ اسکریپتی را نصب کنید که دارای مدل پلاگین سرویس زبان است.
- +اساساً 3 ویژگی اصلی توسط Angular Language Service ارائه شده است.
شما می توانید وب کارگر را در هر جایی از برنامه خود اضافه کنید. برای مثال، اگر فایل حاوی محاسبات گران قیمت شما «src/app/app.component.ts» است، میتوانید با استفاده از دستور «ng generate web-worker app» یک Web Worker اضافه کنید که «src/app/app» را ایجاد میکند. فایل کارگر وب worker.ts. این دستور اقدامات زیر را انجام می دهد
پروژه خود را برای استفاده از Web Workers پیکربندی کنید
app.worker.ts را برای دریافت پیام اضافه می کند
addEventListener('message', ({ data }) => {
@@ -3405,7 +3646,7 @@ How do you add web workers in your application?
});
فایل کامپوننت «app.component.ts» با فایل web worker بهروزرسانی شد
if (typeof Worker !== 'undefined') { @@ -3420,74 +3661,74 @@How do you add web workers in your application?
}
نکته: ممکن است نیاز داشته باشید که کد اولیه web worker داربست خود را برای ارسال پیام به و از آن تغییر دهید.
- +هنگام استفاده از Web Workers در پروژه های Angular باید دو نکته مهم را به خاطر بسپارید:
1.برخی از محیطها یا پلتفرمها (مانند @angular/platform-server) که در رندر سمت سرور استفاده میشوند، از Web Workers پشتیبانی نمیکنند. در این مورد باید مکانیزم بازگشتی برای انجام محاسبات برای کار در این محیط ها فراهم کنید.
2. اجرای Angular در وبکار با استفاده از «@angular/platform-webworker» هنوز در Angular CLI پشتیبانی نمیشود.
در Angular8، CLI Builder API پایدار است و در دسترس توسعه دهندگانی است که می خواهند «Angular CLI» را با افزودن یا تغییر دستورات سفارشی کنند. برای مثال، میتوانید یک سازنده را برای انجام یک کار کاملاً جدید یا تغییر اینکه کدام ابزار شخص ثالث توسط یک دستور موجود استفاده میشود، فراهم کنید.
- +یک تابع سازنده یعنی تابعی که از "API Architect" برای انجام یک فرآیند پیچیده مانند "build" یا "test" استفاده می کند. کد سازنده در یک بسته npm تعریف شده است. به عنوان مثال، BrowserBuilder یک ساخت بسته وب را برای یک هدف مرورگر اجرا می کند و KarmaBuilder سرور Karma را راه اندازی می کند و یک بسته وب را برای آزمایش های واحد اجرا می کند.
- +دستور Angular CLI «ng run» برای فراخوانی سازنده ای با پیکربندی هدف خاص استفاده می شود. فایل پیکربندی فضای کاری، «angular.json»، حاوی تنظیمات پیشفرض برای سازندههای داخلی است.
- +پوسته برنامه راهی برای ارائه بخشی از برنامه شما از طریق یک مسیر در زمان ساخت است. این برای اولین بار رنگ آمیزی برنامه شما که به سرعت ظاهر می شود مفید است زیرا مرورگر می تواند HTML و CSS ایستا را بدون نیاز به مقداردهی اولیه جاوا اسکریپت ارائه دهد. شما می توانید با استفاده از Angular CLI که یک پوسته برنامه برای اجرای سمت سرور برنامه شما ایجاد می کند، به این هدف برسید.
ng generate appShell [options] (or)
ng g appShell [options]
-
+
Angular از قراردادهای بزرگ برای تشخیص نام انواع مختلف استفاده می کند. Angular لیستی از انواع موارد زیر را دنبال می کند.
camelCase : نمادها، ویژگیها، روشها، نام لولهها، انتخابکنندههای دستورالعمل غیرمولفه، ثابتها از حروف کوچک در حرف اول آیتم استفاده میکنند. به عنوان مثال، "selectedUser"
UpperCamelCase (or PascalCase): نام کلاسها، از جمله کلاسهایی که اجزا، رابطها، NgModules، دستورالعملها و لولهها را تعریف میکنند، از حروف بزرگ در حرف اول آیتم استفاده میکنند.
dash-case (or "kebab-case"): در قسمت توصیفی نام فایل ها، انتخابگرهای مؤلفه از خط تیره بین کلمات استفاده می شود. به عنوان مثال، "app-user-list".
UPPER_UNDERSCORE_CASE: همه ثابت ها از حروف بزرگ مرتبط با خط زیر استفاده می کنند. به عنوان مثال، "NUMBER_OF_USERS".
دکوراتور کلاس، دکوراتوری است که بلافاصله قبل از تعریف کلاس ظاهر می شود، که کلاس را از نوع معین اعلام می کند و ابرداده مناسب برای نوع را فراهم می کند.
لیست زیر از دکوراتورها در زیر کلاس دکوراتورها آمده است:
@Component()
@Directive()
@Pipe()
@Injectable()
@NgModule()
دکوراتورهای فیلد کلاس عباراتی هستند که بلافاصله قبل از یک فیلد در تعریف کلاس اعلام می شوند که نوع آن فیلد را مشخص می کند. برخی از نمونه ها عبارتند از: @input و @output،
@Input() myProperty;
@Output() myEvent = new EventEmitter();
-
+
Declarable یک نوع کلاس است که می توانید آن را به لیست اعلانات یک NgModule اضافه کنید. انواع کلاس ها مانند کامپوننت ها، دستورالعمل ها و لوله ها را می توان در ماژول اعلام کرد. ساختار اعلامیه ها به این صورت خواهد بود
declarations: [
@@ -3496,21 +3737,21 @@ What is declarable in Angular?
YourDirective
],
-
+
کلاس های زیر نباید تعریف شوند،
کلاسی که قبلاً در NgModule دیگری اعلام شده است
کلاس های Ngmodule
کلاس های خدماتی
کلاس های کمکی
توکن DI یک توکن جستجوی مرتبط با ارائه دهنده وابستگی در سیستم تزریق وابستگی است. انژکتور یک نقشه ارائه دهنده توکن داخلی دارد که در صورت درخواست وابستگی به آن ارجاع می دهد و رمز DI کلید نقشه است. بیایید استفاده از DI Token را مثال بزنیم،
const BASE_URL = new InjectionToken<string>('BaseUrl');
@@ -3518,21 +3759,21 @@ What is a DI token?
Injector.create({providers: [{provide: BASE_URL, useValue: 'http://some-domain.com'}]});
const url = injector.get(BASE_URL);
-
+
یک زبان دامنه خاص (DSL) یک زبان کامپیوتری است که برای یک دامنه کاربردی خاص تخصصی شده است. Angular زبان مخصوص دامنه (DSL) خود را دارد که به ما اجازه میدهد تا سینتکس html مانند خاص Angular را در بالای html معمولی بنویسیم. این کامپایلر خود را دارد که این نحو را به html کامپایل می کند که مرورگر بتواند آن را درک کند. این DSL در NgModules مانند انیمیشن ها، فرم ها و مسیریابی و ناوبری تعریف شده است.
اساساً شما 3 نحو اصلی را در Angular DSL خواهید دید.
()
: برای رویدادهای خروجی و DOM استفاده می شود.[]
: برای ورودی و ویژگی های خاص عنصر DOM استفاده می شود.*
: دستورالعمل های ساختاری (*ngFor یا *ngIf) ساختار DOM را تحت تاثیر قرار می دهد/تغییر می دهد.()
: برای رویدادهای خروجی و DOM استفاده می شود.
[]
: برای ورودی و ویژگی های خاص عنصر DOM استفاده می شود.
*
: دستورالعمل های ساختاری (*ngFor یا *ngIf) ساختار DOM را تحت تاثیر قرار می دهد/تغییر می دهد.
یک موضوع RxJS نوع خاصی از Observable است که اجازه میدهد مقادیر برای بسیاری از Observerها چندپخشی شوند. در حالی که مشاهده پذیرهای ساده یکپارچه هستند (هر مشاهده کننده مشترک دارای اجرای مستقل از Observable است)، سوژه ها چندپخشی هستند.
یک موضوع مانند یک مشاهده پذیر است، اما می تواند برای بسیاری از مشاهده کنندگان چندپخش شود. سوژه ها مانند EventEmitters هستند: آنها یک رجیستری از شنوندگان زیادی را نگهداری می کنند.
@@ -3550,10 +3791,10 @@Bazel یک ابزار ساخت قدرتمند است که توسط گوگل توسعه یافته و به طور گسترده مورد استفاده قرار می گیرد و می تواند وابستگی های بین بسته های مختلف و اهداف ساخت را پیگیری کند. در Angular8 می توانید برنامه CLI خود را با Bazel بسازید. @@ -3563,7 +3804,7 @@What is Bazel tool?
این امکان را ایجاد می کند که با همان ابزار بک اند و جلویی شما را بسازید
@@ -3579,51 +3820,51 @@بسته @angular/bazel سازنده ای را ارائه می دهد که به Angular CLI اجازه می دهد از Bazel به عنوان ابزار ساخت استفاده کند.
Use in an existing applciation: @angular/bazel را با استفاده از CLI اضافه کنید
ng add @angular/bazel
Use in a new application: بسته را نصب کنید و برنامه را با گزینه مجموعه ایجاد کنید
npm install -g @angular/bazel
ng new --collection=@angular/bazel
وقتی از دستورات ng build و ng serve استفاده می کنید، Bazel در پشت صحنه استفاده می شود و نتایج را در پوشه dist/bin خروجی می دهد.
-
+
گاهی اوقات ممکن است بخواهید سازنده Angular CLI را دور بزنید و Bazel را مستقیماً با استفاده از Bazel CLI اجرا کنید. می توانید با استفاده از بسته @bazel/bazel npm آن را به صورت سراسری نصب کنید. یعنی Bazel CLI در بسته @bazel/bazel موجود است. بعد از اینکه بتوانید دستورات رایج زیر را اعمال کنید،
bazel build [targets] // Compile the default output artifacts of the given targets.
bazel test [targets] // Run the tests with *_test targets found in the pattern.
bazel run [target]: Compile the program represented by target and then run it.
-
+
پلتفرم زمینه ای است که یک برنامه Angular در آن اجرا می شود. رایج ترین پلت فرم برای برنامه های Angular یک مرورگر وب است، اما همچنین می تواند یک سیستم عامل برای یک دستگاه تلفن همراه یا یک وب سرور باشد. Runtime-Platform توسط بستههای angular/platform-*@ ارائه میشود و این بستهها به برنامههایی که از «@angular/core» و «@angular/common» استفاده میکنند اجازه میدهند در محیطهای مختلف اجرا شوند.
به عنوان مثال، Angular می تواند به عنوان چارچوب مستقل از پلت فرم در محیط های مختلف استفاده شود، به عنوان مثال،
در حین اجرا در مرورگر، از بسته پلتفرم-مرورگر استفاده می کند.
هنگامی که SSR (رندر سمت سرور) استفاده می شود، از بسته «پلتفرم-سرور» برای ارائه اجرای وب سرور استفاده می کند.
اگر چندین ماژول یک ماژول را وارد کند، angular آن را فقط یک بار ارزیابی می کند (وقتی اولین بار با ماژول روبرو می شود). از این شرط پیروی می کند حتی ماژول در هر سطحی در سلسله مراتب NgModules وارد شده ظاهر می شود.
- +برای دسترسی مستقیم به عناصر موجود در نما می توانید از دستورالعمل @ViewChild
استفاده کنید. بیایید عنصر ورودی را با یک مرجع بگیریم،
<input #uname> @@ -3636,10 +3877,10 @@- +How do you select an element with in a component template?
console.log(this.input.nativeElement.value); }
در Angular7 می توانید برای تشخیص تغییرات در روتر مشترک شوید. اشتراک رویدادهای روتر به شرح زیر خواهد بود:
this.router.events.subscribe((event: Event) => {})
@@ -3674,10 +3915,10 @@ How do you detect route change in Angular?
}
}
-
+
میتوانید مستقیماً نقشه شی را برای مشتری http ارسال کنید یا کلاس HttpHeaders را برای تهیه هدرها ایجاد کنید.
constructor(private _http: HttpClient) {}
@@ -3696,20 +3937,20 @@ How do you pass headers for HTTP client?
return this._http.get<any[]>('someUrl', { headers: headers, params: params })
-
+
از انتشار Angular8 به بعد، برنامهها با استفاده از استراتژی بارگذاری تفاضلی از CLI ساخته میشوند تا دو باندل جداگانه به عنوان بخشی از برنامه مستقر شما بسازند.
اولین ساخت شامل نحو ES2015 است که از مزیت پشتیبانی داخلی در مرورگرهای مدرن بهره میبرد، پلیفیلهای کمتری ارسال میکند و منجر به اندازه بستهای کوچکتر میشود.
ساخت دوم شامل نحو قدیمی ES5 برای پشتیبانی از مرورگرهای قدیمی با تمام پلیفیلهای لازم است. اما این باعث می شود اندازه بسته بزرگتر شود.
نکته: این استراتژی برای پشتیبانی از چندین مرورگر استفاده می شود، اما فقط کد مورد نیاز مرورگر را بارگیری می کند.
- +بله، Angular 8 از واردات پویا در پیکربندی روتر پشتیبانی می کند. به عنوان مثال، میتوانید از دستور import برای بارگذاری تنبل ماژول با استفاده از روش «loadChildren» استفاده کنید و توسط IDEها (VSCode و WebStorm)، بسته وب و غیره قابل درک است.
قبلاً به صورت زیر نوشته شده بودید تا ماژول ویژگی را با تنبلی بارگیری کنید. به اشتباه، اگر در نام ماژول اشتباه تایپی داشته باشید، همچنان رشته را میپذیرد و در طول زمان ساخت، خطا میدهد.
{path: ‘user’, loadChildren: () => import(‘./users/user.module’).then(m => m.UserModule)};
-
+
Lazy loading یکی از کاربردی ترین مفاهیم Angular Routing است. این به ما کمک می کند تا به جای دانلود همه چیز در یک بسته بزرگ، صفحات وب را به صورت تکه ای دانلود کنیم. برای بارگذاری تنبل با بارگیری ناهمزمان ماژول ویژگی برای مسیریابی هر زمان که لازم باشد با استفاده از ویژگی «loadChildren» استفاده می شود. بیایید هر دو ماژول ویژگی «مشتری» و «سفارش» را مانند زیر بارگیری کنیم.
const routes: Routes = [
@@ -3741,10 +3982,10 @@ What is lazy loading?
}
];
-
+
نسخه Angular 8.0 API های Workspace را معرفی می کند تا خواندن و اصلاح فایل angular.json را برای توسعه دهندگان به جای تغییر دستی آسان تر کند. در حال حاضر، تنها فرمت Storage3 پشتیبانی شده، فرمت مبتنی بر JSON است که توسط Angular CLI استفاده میشود. میتوانید گزینه بهینهسازی را برای build target به صورت زیر فعال یا اضافه کنید.
import { NodeJsSyncHost } from '@angular-devkit/core/node';
@@ -3771,18 +4012,18 @@ What are workspace APIs?
addBuildTargetOption();
-
+
ارتقای Angular با استفاده از دستور Angular CLI «ng update» همانطور که در زیر ذکر شده است بسیار ساده تر است. به عنوان مثال، اگر از Angular 7 به 8 ارتقا دهید، وارد کردن مسیر لود شده تنبل شما به صورت خودکار به نحو واردات جدید منتقل می شود.
$ ng update @angular/cli @angular/core- +
Angular Material مجموعه ای از اجزای طراحی متریال برای فریم ورک Angular است که از مشخصات طراحی متریال پیروی می کند. با استفاده از Angular Material می توانید Material Design را به راحتی اعمال کنید. نصب را می توان از طریق npm یا نخ انجام داد،
npm install --save @angular/material @angular/cdk @angular/animations @@ -3790,10 +4031,10 @@What is Angular Material?
yarn add @angular/material @angular/cdk @angular/animations
از دو نسخه اخیر همه مرورگرهای اصلی پشتیبانی می کند. آخرین نسخه متریال Angular 8.1.1 است
- +اگر از سرویس «location» را به سرویس «Location» در Angular میگذارد. بیایید این ماژول را مانند زیر به AppModule اضافه کنیم،
// Other imports ...
@@ -3807,15 +4048,15 @@ How do you upgrade location service of angularjs?
})
export class AppModule {}
-
+
NgUpgrade یک کتابخانه است که توسط تیم Angular گردآوری شده است که می توانید از آن در برنامه های خود برای ترکیب و مطابقت اجزای AngularJS و Angular و پل زدن سیستم های تزریق وابستگی AngularJS و Angular استفاده کنید.
- +Angular CLI همه موارد مورد نیاز را با چارچوب تست Jasmine دانلود و نصب می کند. برای دیدن نتایج آزمون فقط باید «ng test» را اجرا کنید. بهطور پیشفرض، این دستور برنامه را در حالت تماشا میسازد و «Karma test runner» را راهاندازی میکند. خروجی نتایج آزمون به صورت زیر خواهد بود:
10% building modules 1/1 modules 0 active @@ -3826,13 +4067,13 @@How do you test Angular application using CLI?
Chrome ...: Executed 3 of 3 SUCCESS (0.135 secs / 0.205 secs)
نکته: یک مرورگر کروم نیز باز می شود و خروجی تست را در "Jasmine HTML Reporter" نمایش می دهد.
- +Angular CLI به طور رسمی از polyfills پشتیبانی می کند. هنگامی که یک پروژه جدید با دستور ng new ایجاد می کنید، یک فایل پیکربندی src/polyfills.ts
به عنوان بخشی از پوشه پروژه شما ایجاد می شود. این فایل شامل اجباری و بسیاری از polyfill های اختیاری به عنوان دستورهای واردات جاوا اسکریپت است. بیایید پلی پرها را دسته بندی کنیم،
Mandatory polyfills: هنگامی که پروژه خود را با دستور ng new و دستورهای import مربوطه فعال در فایل 'src/polyfills.ts' فعال می کنید، اینها به طور خودکار نصب می شوند.
import 'web-animations-js';
-
+
میتوانید ApplicationRef یا NgZone یا ChangeDetectorRef را به کامپوننت خود تزریق کنید و از روشهای خاص زیر برای شروع تشخیص تغییر در Angular استفاده کنید. یعنی 3 راه ممکن وجود دارد،
ApplicationRef.tick(): از این روش برای پردازش صریح تشخیص تغییر و عوارض جانبی آن استفاده کنید. درخت کامپوننت کامل را بررسی می کند.
NgZone.run(callback): عملکرد برگشت به تماس را در داخل منطقه Angular ارزیابی می کند.
ChangeDetectorRef.detectChanges(): فقط اجزاء و بچه ها را تشخیص می دهد.
نسخه های مختلفی از فریم ورک Angular وجود دارد. بیایید ویژگی های تمام نسخه های مختلف را ببینیم،
Angular 1 (AngularJS) اولین فریم ورک زاویه ای است که در سال 2010 منتشر شد.
AngularJS برای دستگاه های تلفن همراه ساخته نشده است.
بر پایه کنترلرهایی با معماری MVC ساخته شده است.
Angular 2 در سال 2016 منتشر شد. Angular 2 بازنویسی کامل نسخه Angular1 است.
مشکلات عملکرد نسخه Angular 1 در نسخه Angular 2 برطرف شده است.
Angular 2 برخلاف نسخه Angular 1 از ابتدا برای دستگاه های تلفن همراه ساخته شده است.
Angular 2 مبتنی بر کامپوننت است.
نسخه های مختلف بسته در Angular 2 به شرح زیر است:
@angular/core نسخه 2.3.0
@angular/compiler نسخه 2.3.0
@angular/http نسخه 2.3.0
@angular/router نسخه 3.3.0
بسته روتر قبلاً نسخه 3 است، بنابراین برای جلوگیری از سردرگمی به نسخه Angular 4 و نسخه 3 نادیده گرفته شده است.
اندازه فایل کد تولید شده توسط کامپایلر در حالت AOT بسیار کاهش یافته است.
با Angular 4 اندازه بستههای تولیدی صدها کیلوبایت کاهش مییابد.
ویژگی های انیمیشن از angular/core حذف شده و به عنوان یک بسته جداگانه تشکیل می شود.
پشتیبانی از Typescript 2.1 و 2.2.
جهانی زاویه ای
HttpClient جدید
Angular 5 زاویه ای را سریعتر می کند. زمان بارگذاری و زمان اجرا را بهبود بخشید.
با بهینه ساز ساخت جدید ارسال می شود.
پشتیبانی از Typescript 2.5.
کارگر خدماتی
در ماه می 2018 منتشر شد.
شامل رابط خط فرمان زاویه ای (CLI)، کیت توسعه اجزا (CDK)، بسته مواد زاویه ای، عناصر زاویه ای.
رفع اشکال سرویس کارگر.
i18n
حالت آزمایشی برای آیوی.
RxJS 6.0
لرزش درخت
در اکتبر 2018 منتشر شد.
TypeScript 3.1
RxJS 6.3
Angular CLI جدید
قابلیت CLI Prompts توانایی پرسیدن سوالات از کاربر را قبل از اجرا فراهم می کند. مانند گفتگوی تعاملی بین کاربر و CLI است
با بهبود قابلیت CLI Prompts، به توسعه دهندگان کمک می کند تا تصمیم بگیرند. دستورات جدید ng از کاربران میخواهند مسیریابی و انواع سبکهای CSS (SCSS) و ng add @angular/material تم و ژستها یا انیمیشنها را میخواهد.
در ماه می 2019 منتشر شد.
TypeScript 3.4
در فوریه 2020 منتشر شد.
TypeScript 3.7
Ivy به طور پیش فرض فعال است
در ژوئن 2020 منتشر شد.
TypeScript 3.9
TSlib 2.0
در زیر لیستی از اصول امنیتی در زاویه ای آورده شده است.
باید از استفاده مستقیم از APIهای DOM اجتناب کنید.
شما باید Content Security Policy (CSP) را فعال کرده و وب سرور خود را برای بازگرداندن هدرهای مناسب CSP HTTP پیکربندی کنید.
باید از کامپایلر قالب آفلاین استفاده کنید.
باید از محافظ XSS سمت سرور استفاده کنید.
باید از DOM Sanitizer استفاده کنید.
شما باید از حملات CSRF یا XSRF جلوگیری کنید.
Angular از ادغام با Web Tracing Framework (WTF) به منظور اجرای عملیات پشتیبانی شده است. از آنجایی که به خوبی نگهداری نمی شود و در اکثر برنامه ها شکسته می شود، در آخرین نسخه منسوخ شده است.
- +هر دو «@angular/platform-webworker» و «@angular/platform-webworker-dynamic» رسماً منسوخ شدهاند، تیم Angular متوجه شد که اجرای برنامه Angular روی Web worker عمل خوبی نیست.
- +Angular CLI نسخه نصب شده خود را با استفاده از روش های مختلف زیر با استفاده از دستور ng ارائه می دهد
ng v @@ -3986,10 +4227,10 @@- +How do you find angular CLI version?
Angular: ...
Angular از جدیدترین مرورگرها پشتیبانی می کند که شامل مرورگرهای دسکتاپ و موبایل می شود.
این یک کتابخانه داربستی است که نحوه تولید یا تبدیل یک پروژه برنامه نویسی را با ایجاد، اصلاح، تغییر شکل یا جابجایی فایل ها و کد تعریف می کند. قوانینی را تعریف می کند که بر روی یک فایل سیستم مجازی به نام درخت عمل می کنند.
- +در دنیای شماتیک، این تابعی است که روی درخت فایل برای ایجاد، حذف یا اصلاح فایلها به شیوهای خاص عمل میکند.
- +طرحواره ها با ابزار خط فرمان خود به نام Schematics CLI عرضه می شوند. برای نصب شماتیک های اجرایی استفاده می شود که می توانید از آن برای ایجاد یک مجموعه شماتیک جدید با نام اولیه شماتیک استفاده کنید. پوشه مجموعه یک فضای کاری برای شماتیک ها است. همچنین می توانید از دستور schematics برای اضافه کردن یک شماتیک جدید به مجموعه موجود یا گسترش یک شماتیک موجود استفاده کنید. شما می توانید Schematic CLI را بصورت سراسری به صورت زیر نصب کنید.
npm install -g @angular-devkit/schematics-cli- +
در زیر بهترین شیوه های امنیتی در زاویه ای آورده شده است.
از آخرین نسخه های کتابخانه Angular استفاده کنید
کپی Angular خود را تغییر ندهید
از API های Angular که در مستندات به عنوان "ریسک امنیتی" علامت گذاری شده اند، خودداری کنید.
Angular به طور پیش فرض همه مقادیر را غیرقابل اعتماد می داند. به عنوان مثال، Angular پاکسازی میکند و از مقادیر نامعتبر فرار میکند وقتی یک مقدار از یک الگو، از طریق ویژگی، ویژگی، سبک، کلاس اتصال یا درونیابی در DOM درج میشود.
- +کامپایلر قالب آفلاین از آسیب پذیری های ناشی از تزریق قالب جلوگیری می کند و عملکرد برنامه را تا حد زیادی بهبود می بخشد. بنابراین توصیه می شود از کامپایلر قالب آفلاین در استقرار تولید بدون ایجاد پویا هیچ قالبی استفاده کنید.
- +Angular زمینه های امنیتی زیر را برای پاکسازی تعریف می کند:
<a href>
استفاده می شود.<script src>
بارگیری و اجرا می شود.HTML: هنگام تفسیر یک مقدار به عنوان HTML مانند اتصال به innerHtml استفاده می شود.
Style: هنگام اتصال CSS به ویژگی style استفاده می شود.
URL: برای ویژگی های URL مانند <a href>
استفاده می شود.
Resource URL: این یک URL است که به عنوان کدی مانند <script src>
بارگیری و اجرا می شود.
Sanitization بازرسی یک مقدار نامعتبر است که آن را به مقداری تبدیل می کند که برای درج آن در DOM ایمن است. بله، Angular از ضد عفونی کردن پشتیبانی می کند. مقادیر نامعتبر را برای HTML، سبکها و URLها پاکسازی میکند، اما پاکسازی URLهای منبع ممکن نیست زیرا حاوی کد دلخواه هستند.
- +innerHtml یکی از ویژگی های HTML-Elements است که به شما امکان می دهد محتوای html آن را به صورت برنامه ریزی شده تنظیم کنید. بیایید قطعه کد html زیر را در تگ «
تفاوت اصلی بین کد درون یابی شده و کد داخلی در رفتار کد تفسیر شده است. محتوای درونیابی همیشه حذف میشود، یعنی HTML تفسیر نمیشود و مرورگر براکتهای زاویهای را در محتوای متن عنصر نمایش میدهد. در جایی که در innerHTML binding، محتوا تفسیر می شود، یعنی مرورگر کاراکترهای < و > را به عنوان HTMLEntities تبدیل می کند. به عنوان مثال، استفاده در قالب به صورت زیر خواهد بود.
<p>Interpolated value:</p> @@ -4120,10 +4361,10 @@What is the difference between interpolated content and innerHTML?
}
حتی با وجود اینکه innerHTML binding شانس حمله XSS را ایجاد می کند، Angular این مقدار را ناامن تشخیص می دهد و به طور خودکار آن را پاکسازی می کند.
- +گاهی اوقات برنامه ها واقعاً نیاز دارند که کدهای اجرایی مانند نمایش <iframe>
را از یک URL داشته باشند. در این مورد، باید با گفتن اینکه یک مقدار را بررسی کرده اید، نحوه تولید آن را بررسی کرده اید و مطمئن شده اید که همیشه ایمن است، از پاکسازی خودکار در Angular جلوگیری کنید. اساساً شامل 2 مرحله است،
با فراخوانی برخی از روشهای زیر، مقدار قابل اعتماد را علامتگذاری کنید
bypassSecurityTrustHtml
bypassSecurityTrustScript
bypassSecurityTrustStyle
bypassSecurityTrustUrl
bypassSecurityTrustResourceUrl
خیر، APIها یا روشهای داخلی مرورگر DOM بهطور خودکار از شما در برابر آسیبپذیریهای امنیتی محافظت نمیکنند. در این مورد توصیه می شود به جای تعامل مستقیم با DOM از قالب های Angular استفاده کنید. اگر اجتناب ناپذیر است، از عملکردهای ضدعفونی داخلی Angular استفاده کنید.
- +«DomSanitizer» برای کمک به جلوگیری از اشکالات امنیتی Cross Site Scripting (XSS) با پاکسازی مقادیر برای ایمن بودن استفاده در زمینههای مختلف DOM استفاده میشود.
- +حفاظت XSS سمت سرور در یک برنامه زاویه ای با استفاده از زبان قالبی که به طور خودکار از مقادیر برای جلوگیری از آسیب پذیری های XSS در سرور فرار می کند، پشتیبانی می شود. اما از زبان قالب برای تولید الگوهای Angular در سمت سرور استفاده نکنید که خطر زیادی برای معرفی آسیبپذیریهای تزریق قالب ایجاد میکند.
- +Angular دارای پشتیبانی داخلی برای جلوگیری از آسیبپذیریهای سطح http مانند جعل درخواست بین سایتی (CSRF یا XSRF) و گنجاندن اسکریپت بین سایتی (XSSI) است. حتی اگر این آسیبپذیریها باید در سمت سرور کاهش یابند، Angular کمکهایی را برای آسانتر کردن ادغام در سمت کلاینت ارائه میکند.
HttpClient از مکانیزم نشانه ای پشتیبانی می کند که برای جلوگیری از حملات XSRF استفاده می شود
کتابخانه HttpClient قرارداد پاسخهای JSON پیشوندی را تشخیص میدهد (که js غیرقابل اجرا با نویسههای ")]}'،\n" کد میکند) و به طور خودکار رشته ")]}'،\n" را از همه پاسخهای قبل حذف میکند. تجزیه بیشتر
رهگیرهای Http بخشی از @angular/common/http هستند که درخواستهای HTTP را از برنامه شما به سرور و برعکس در پاسخهای HTTP بررسی و تبدیل میکنند. این رهگیرها می توانند انواع مختلفی از وظایف ضمنی، از احراز هویت گرفته تا ثبت را انجام دهند.
نحو رابط HttpInterceptor مانند زیر است.
@@ -4206,23 +4447,23 @@رهگیرهای HTTP را می توان برای انواع مختلفی از وظایف استفاده کرد،
Authentication
Logging
Caching
Fake backend
URL transformation
Modifying headers
بله، Angular از چندین رهگیر در یک زمان پشتیبانی می کند. می توانید چندین رهگیر را در ویژگی ارائه دهندگان تعریف کنید:
providers: [ @@ -4231,10 +4472,10 @@Is multiple interceptors supported in Angular?
],
رهگیرها به ترتیبی که ارائه شده اند فراخوانی می شوند. i.n، MyFirst Interceptor ابتدا در پیکربندی رهگیرهای بالا فراخوانی می شود.
- +میتوانید با وارد کردن «HttpClientModule» فقط در AppModule خود، از همان نمونه «HttpInterceptors» برای کل برنامه استفاده کنید، و رهگیرها را به انژکتور برنامه root اضافه کنید.
برای مثال، بیایید کلاسی را تعریف کنیم که در برنامه root قابل تزریق باشد.
Angular زمینه های بین المللی سازی زیر را ساده می کند:
نمایش تاریخ، عدد، درصد و ارز در قالب محلی.
آماده سازی متن در قالب های مؤلفه برای ترجمه.
رسیدگی به اشکال جمع کلمات.
مدیریت متن جایگزین.
بهطور پیشفرض، Angular فقط حاوی دادههای محلی برای en-US است که انگلیسی است که در ایالات متحده آمریکا صحبت میشود. اما اگر میخواهید روی محلی دیگر تنظیم کنید، باید دادههای محلی را برای آن محلی جدید وارد کنید. پس از آن می توانید با استفاده از روش «registerLocaleData» ثبت نام کنید و نحو این روش به شکل زیر است.
registerLocaleData(data: any, localeId?: any, extraData?: any): void
@@ -4299,19 +4540,19 @@ How do you manually register locale data?
registerLocaleData(localeDe, 'de');
-
+
فرآیند ترجمه قالب i18n دارای چهار مرحله است:
Mark static text messages in your component templates for translation: می توانید i18n را روی هر تگ عنصری که متن ثابت آن باید ترجمه شود قرار دهید. به عنوان مثال، برای عنوان زیر به ویژگی i18n نیاز دارید.
<h1 i18n>Hello i18n!</h1>
Create a translation file: از دستور Angular CLI xi18n برای استخراج متن علامت گذاری شده در یک فایل منبع ترجمه استاندارد صنعتی استفاده کنید. به عنوان مثال، پنجره ترمینال را در ریشه پروژه برنامه باز کنید و دستور CLI xi18n را اجرا کنید.
```bash @@ -4347,16 +4588,16 @@What are the four phases of template translation?
--i18nLocale= locale id
ویژگی Angular i18n محتوای قابل ترجمه را علامت گذاری می کند. این یک ویژگی سفارشی است که توسط ابزارها و کامپایلرهای Angular شناسایی می شود. کامپایلر پس از ترجمه آن را حذف می کند.
Note: به یاد داشته باشید که i18n یک دستورالعمل Angular نیست.
- +هنگامی که متن قابل ترجمه را تغییر میدهید، ابزار استخراج Angular یک شناسه جدید برای آن واحد ترجمه ایجاد میکند. به دلیل این رفتار، باید هر بار فایل ترجمه را با شناسه جدید به روز کنید.
برای مثال، فایل ترجمه «messages.de.xlf.html» برای برخی از پیامهای متنی زیر واحد انتقال ایجاد کرده است:
@@ -4366,10 +4607,10 @@<h1 i18n="@@welcomeHeader">Hello i18n!</h1>- +
شما باید شناسه های سفارشی را منحصر به فرد تعریف کنید. اگر از یک شناسه برای دو پیام متنی مختلف استفاده می کنید، فقط اولین مورد استخراج می شود. اما ترجمه آن به جای هر دو پیامک اصلی استفاده می شود.
برای مثال، بیایید همان شناسه سفارشی myCustomId را برای دو پیام تعریف کنیم:
@@ -4389,19 +4630,19 @@<h2>Guten Morgen</h2> <h2>Guten Morgen</h2>- +
بله، میتوانید با استفاده از ویژگی «
<ng-container i18n>I'm not using any DOM element for translation</ng-container>
به یاد داشته باشید که «
میتوانید ویژگیها را با پیوست کردن ویژگی «i18n-x» ترجمه کنید، جایی که x نام ویژگی برای ترجمه است. به عنوان مثال، می توانید ویژگی عنوان تصویر را به صورت زیر ترجمه کنید.
<img [src]="example" i18n-title title="Internationlization" /> @@ -4414,35 +4655,35 @@How can I translate attribute?
تعدد بسته به زبان دارای دسته های زیر است.
= 0 (یا هر عدد دیگری)
صفر
یک
دو
تعداد کمی
بسیاری
دیگر
عبارت ICU شبیه عبارات جمع است با این تفاوت که شما از بین ترجمه های جایگزین بر اساس مقدار رشته به جای عدد انتخاب می کنید. در اینجا شما آن مقادیر رشته را تعریف می کنید.
بیایید مؤلفه را با ویژگی «residenceStatus» که دارای مقادیر ممکن «شهروند»، «مقیم دائم» و «خارجی» است، در نظر بگیریم و پیام آن مقادیر را به ترجمههای مناسب نگاشت میکند.
<span i18n>The person is {residenceStatus, select, citizen {citizen} permanent resident {permanentResident} foreigner {foreigner}}</span>- +
بهطور پیشفرض، هنگامی که ترجمه وجود ندارد، پیام هشداری مانند «ترجمه از دست رفته برای پیام «somekey» ایجاد میکند. اما می توانید با سطح متفاوتی از پیام در کامپایلر Angular به صورت زیر پیکربندی کنید.
Error: خطا میده اگر از کامپایل AOT استفاده می کنید، بیلد با شکست مواجه می شود. اما اگر از کامپایل JIT استفاده می کنید، برنامه بارگذاری نمی شود.
Warning (default): این یک اخطار «مفقود ترجمه» را در کنسول یا پوسته نشان میدهد.
Ignore: هیچ کاری نمی کند.
اگر از کامپایلر AOT استفاده می کنید، باید تغییراتی را در بخش پیکربندی فایل پیکربندی Angular CLI خود، angular.json انجام دهید.
@@ -4467,10 +4708,10 @@میتوانید پیکربندی ساخت مانند مسیر فایل ترجمه، نام، قالب و آدرس برنامه را در تنظیمات «پیکربندی» فایل Angular.json ارائه کنید. به عنوان مثال، نسخه آلمانی برنامه شما بیلد را به صورت زیر پیکربندی کرده است:
"configurations": {
@@ -4485,49 +4726,49 @@ How do you provide build configuration for multiple locales?
}
}
-
+
کتابخانه Angular یک پروژه Angular است که با یک برنامه تفاوت دارد زیرا نمی تواند به تنهایی اجرا شود. باید وارد شده و در یک برنامه استفاده شود. برای مثال، میتوانید کتابخانه «سرویسکار» را به یک برنامه Angular وارد یا اضافه کنید که یک برنامه کاربردی را به یک برنامه وب پیشرو (PWA) تبدیل میکند.
Note: شما می توانید کتابخانه شخص ثالث خود را ایجاد کنید و آن را به عنوان بسته npm منتشر کنید تا در یک برنامه استفاده شود.
- +کامپایلر AOT بخشی از یک فرآیند ساخت است که یک بسته برنامه کوچک، سریع و آماده برای اجرا تولید میکند، معمولاً برای تولید. این کد Angular HTML و TypeScript شما را در مرحله ساخت قبل از دانلود و اجرای آن کد به کد جاوا اسکریپت کارآمد تبدیل می کند.
- +شما می توانید هر عنصر DOM را از طریق ElementRef با تزریق آن به سازنده کامپوننت خود کنترل کنید. یعنی کامپوننت باید سازنده ای با پارامتر ElementRef داشته باشد،
constructor(myElement: ElementRef) {
el.nativeElement.style.backgroundColor = 'yellow';
}
-
+
TestBed یک api برای نوشتن تست های واحد برای برنامه های Angular و کتابخانه های آن است. حتی با وجود اینکه ما هنوز تستهای خود را در Jasmine مینویسیم و با استفاده از Karma اجرا میکنیم، این API راه آسانتری برای ایجاد اجزا، مدیریت تزریق، آزمایش رفتار ناهمزمان و تعامل با برنامه ما ارائه میکند.
- +نقاله یک چارچوب تست سرتاسر برای برنامه های Angular و AngularJS است. این برنامه آزمایش هایی را بر روی برنامه شما که در یک مرورگر واقعی اجرا می شود، اجرا می کند و مانند یک کاربر با آن تعامل دارد.
npm install -g protractor
-
+
مجموعه مجموعه ای از شماتیک های مرتبط است که در یک بسته npm جمع آوری شده است. به عنوان مثال، مجموعه @schematics/angular
در Angular CLI برای اعمال تبدیل به یک پروژه برنامه وب استفاده می شود. شما می توانید مجموعه شماتیک خود را برای سفارشی سازی پروژه های زاویه ای ایجاد کنید.
شما می توانید مجموعه های شماتیک خود را برای ادغام کتابخانه خود با Angular CLI ایجاد کنید. این مجموعه ها به عنوان 3 شماتیک اصلی طبقه بندی می شوند.
می توانید با استفاده از 3 مرحله ساده از jquery در Angular استفاده کنید.
Install the dependency: ابتدا وابستگی jquery را با استفاده از npm نصب کنید
npm install --save jquery
Add the jquery script: در پروژه Angular-CLI، مسیر نسبی را به jquery در فایل angular.json اضافه کنید.
"scripts": [
@@ -4557,7 +4798,7 @@ How do you use jquery in Angular?
]
Start using jquery: عنصر را در قالب تعریف کنید. در حالی که متغیر jquery را اعلام کرده و کلاس های CSS را روی عنصر اعمال کنید.
<div id="elementId"> @@ -4582,10 +4823,10 @@- +How do you use jquery in Angular?
} }
این استثنا به دلیل عدم وجود HttpClientModule در ماژول شما است. شما فقط باید در ماژول به صورت زیر وارد کنید:
import { HttpClientModule } from '@angular/common/http';
@@ -4600,10 +4841,10 @@ What is the reason for No provider for HTTP exception?
})
export class AppModule { }
-
+
RouteState یک رابط است که وضعیت روتر را به عنوان درختی از مسیرهای فعال نشان می دهد.
interface RouterState extends Tree {
@@ -4612,10 +4853,10 @@ What is router state?
}
با استفاده از سرویس Router و ویژگی routerState می توانید از هر نقطه در برنامه Angular به RouterState فعلی دسترسی داشته باشید.
- +هنگامی که پروژه خود را با cli زاویه ای ایجاد می کنید، می توانید از دستور "ng new" استفاده کنید. تمام اجزای شما را با فایل های sass از پیش تعریف شده تولید می کند.
ng new My_New_Project --style=sass
@@ -4624,25 +4865,25 @@ How can I use SASS in angular project?
ng set defaults.styleExt scss
-
+
ویژگی hidden برای نشان دادن یا پنهان کردن عنصر DOM مرتبط بر اساس یک عبارت استفاده می شود. می توان آن را نزدیک به دستورالعمل «ng-show» در AngularJS مقایسه کرد. فرض کنید می خواهید نام کاربری را بر اساس در دسترس بودن کاربر با استفاده از ویژگی "مخفی" نشان دهید.
<div [hidden]="!user.name">
My name is: {{user.name}}
</div>
-
+
تفاوت اصلی این است که *ngIf عنصر را از DOM حذف می کند، در حالی که [hidden] در واقع با تنظیم «display:none» با سبک CSS بازی می کند. به طور کلی اضافه کردن و حذف موارد از DOM برای اقدامات مکرر گران است.
- +لوله slice برای ایجاد یک آرایه یا رشته جدید حاوی زیرمجموعه (برش) از عناصر استفاده می شود. سینتکس به شکل زیر است:
{{ value_expression | slice : start [ : end ] }}
@@ -4659,10 +4900,10 @@ What is slice pipe?
greeting: string[] = ['h', 'e', 'l', 'l', 'o', 'm','o', 'r', 'n', 'i', 'n', 'g'];
}
-
+
ویژگی index دستورالعمل NgFor برای برگرداندن شاخص مبتنی بر صفر مورد در هر تکرار استفاده می شود. شما می توانید شاخص را در یک متغیر ورودی الگو گرفته و از آن در قالب استفاده کنید. @@ -4682,7 +4923,7 @@What is index property in ngFor directive?
هدف اصلی استفاده از *ngFor with trackBy بهینه سازی عملکرد است. معمولاً اگر از NgFor با مجموعه دادههای بزرگ استفاده میکنید، یک تغییر کوچک به یک آیتم با حذف یا اضافه کردن یک مورد، میتواند باعث ایجاد آبشاری از دستکاریهای DOM شود. در این مورد، Angular فقط یک لیست تازه از ارجاعات اشیاء جدید و جایگزینی عناصر DOM قدیمی با تمام عناصر DOM جدید را می بیند. میتوانید با ارائه یک تابع «trackBy» که فهرست و مورد فعلی را بهعنوان آرگومان میگیرد و باید شناسه منحصربهفرد این مورد را برگرداند، به Angular کمک کنید تا موارد اضافه یا حذف شده را ردیابی کند.
For example, lets set trackBy to the trackByTodos() method
@@ -4694,10 +4935,10 @@trackByTodos(index: number, item: Todo): number { return todo.id; }
-
+
دستورالعمل NgSwitch شبیه دستور سوئیچ جاوا اسکریپت است که یک عنصر را از بین چندین عنصر ممکن بر اساس یک شرط سوئیچ نمایش می دهد. در این حالت فقط عنصر انتخاب شده در DOM قرار می گیرد. همراه با دستورات «NgSwitch»، «NgSwitchCase» و «NgSwitchDefault» استفاده شده است.
به عنوان مثال، اجازه دهید جزئیات مرورگر را بر اساس مرورگر انتخابی با استفاده از دستورالعمل ngSwitch نمایش دهیم.
@@ -4709,91 +4950,91 @@بله، به دو صورت می توان برای ورودی ها و خروجی ها نام مستعار انجام داد.
نام مستعار در ابرداده: ورودی ها و خروجی ها در فراداده با استفاده از یک رشته (😃 با نقطه مشخص (😃 با نام ویژگی دستوری در سمت چپ و نام مستعار عمومی در سمت راست نام مستعار می شوند. یعنی در قالب ویژگی Name:alias خواهد بود.
inputs: ['input1: buyItem'],
outputs: ['outputEvent1: completedEvent']
Aliasing with @Input()/@Output() decorator: نام مستعار را می توان با ارسال نام مستعار به @Input()/@Output() decorator.i.e برای نام دارایی مشخص کرد. به شکل @Input(نام مستعار) یا @Output(نام مستعار) خواهد بود.
@Input('buyItem') input1: string;
@Output('completedEvent') outputEvent1 = new EventEmitter<string>();
-
+
اپراتور navigation ایمن (؟) (یا به عنوان اپراتور الویس شناخته می شود) برای محافظت در برابر مقادیر null و undefined در مسیرهای ویژگی استفاده می شود، زمانی که شما از وجود یا عدم وجود یک مسیر اطلاع ندارید. یعنی مقدار مسیر شی را در صورت وجود برمی گرداند، در غیر این صورت مقدار null را برمی گرداند.
For example, you can access nested properties of a user profile easily without null reference errors as below,
<p>The user firstName is: {{user?.fullName.firstName}}</p>
Using this safe navigation operator, Angular framework stops evaluating the expression when it hits the first null value and renders the view without any errors.
- +شما به پیکربندی خاصی نیاز ندارید. در Angular9، رندر Ivy کامپایلر پیش فرض Angular است. اگرچه Ivy خود Angular8 در دسترس است، باید آن را در فایل tsconfig.json به صورت زیر پیکربندی کنید:
"angularCompilerOptions": { "enableIvy": true }
-
+
Angular 9 با جایگزینی تابع get قدیمی با روش inject جدید، تغییرات ایمن نوع را در تغییرات TestBed API ارائه میکند. زیرا روش TestBed.get از نظر نوع ایمن نیست. استفاده به شرح زیر خواهد بود،
TestBed.get(ChangeDetectorRef) // returns any. It is deprecated now.
TestBed.inject(ChangeDetectorRef) // returns ChangeDetectorRef
-
+
در Angular 8، پرچم استاتیک برای ViewChild مورد نیاز است. در حالی که در Angular9، دیگر نیازی به عبور از این ویژگی ندارید. هنگامی که با استفاده از «ng update» به Angular9 بهروزرسانی کردید، انتقال اسکریپت { static: false } را در همه جا حذف میکند.
@ViewChild(ChildDirective) child: ChildDirective; // Angular9 usage
@ViewChild(ChildDirective, { static: false }) child: ChildDirective; //Angular8 usage
-
+
زبان عبارت الگوی Angular از سه عملگر خاص قالب پشتیبانی می کند.
اپراتور لوله
اپراتور ناوبری ایمن
عملگر ادعای غیر تهی
اپراتور لوله نسبت به اپراتور سه تایی (?😃 اولویت بیشتری دارد. به عنوان مثال، عبارت «اول؟ دوم : سوم | چهارم به عنوان «اول؟ دوم : (سوم | چهارم)`.
- +مؤلفه ورودی هر مؤلفه ای است که Angular به طور ضروری بارگذاری می کند (یعنی عدم ارجاع آن در قالب) بر اساس نوع. به دلیل این رفتار، کامپایلر Angular در طول کامپایل نمی تواند آنها را پیدا کند. این مؤلفه ها به صورت پویا با «ComponentFactoryResolver» ایجاد می شوند.
اساساً دو نوع اصلی از مؤلفه های ورودی وجود دارد که به شرح زیر است:
مؤلفه ریشه بوت استرپ
مؤلفه ای که در مسیر مشخص می کنید
کامپوننت بوت استرپ یک جزء ورودی است که Angular در طول فرآیند بوت استرپ یا زمان راه اندازی برنامه در DOM بارگذاری می کند. به طور کلی، این مؤلفه بوت استرپ یا ریشه به عنوان «AppComponent» در ماژول ریشه شما با استفاده از ویژگی «bootstrap» به شرح زیر نامگذاری می شود.
@NgModule({ @@ -4810,10 +5051,10 @@- +What is a bootstrapped component?
bootstrap: [AppComponent] // bootstrapped entry component need to be declared here })
میتوانید به جای استفاده از آرایه بوت استرپ در حاشیهنویسی «@NgModule» از هوک «ngDoBootstrap» برای راهاندازی دستی برنامه استفاده کنید. این قلاب بخشی از رابط «DoBootstap» است.
interface DoBootstrap { @@ -4828,15 +5069,15 @@- +How do you manually bootstrap an application?
} }
بله، کامپوننت بوت استرپ باید جزء ورودی باشد. این به این دلیل است که فرآیند بوت استرپ یک فرآیند ضروری است.
- +اجزای مورد اشاره در پیکربندی روتر به عنوان اجزای ورودی مسیریابی نامیده می شوند. این جزء ورودی مسیریابی شده در تعریف مسیر به صورت زیر تعریف شده است:
const routes: Routes = [ @@ -4848,49 +5089,49 @@What is a routed entry component?
از آنجایی که تعریف روتر شما را ملزم می کند که کامپوننت را در دو مکان (روتر و ورودی کامپوننت) اضافه کنید، این اجزا همیشه جزء ورودی هستند.
توجه: کامپایلرها به اندازه کافی هوشمند هستند که تعریف روتر را تشخیص دهند و به طور خودکار جزء روتر را به "entryComponents" اضافه کنند.
- +اغلب اوقات، برای تنظیم اجزای ورودی در آرایه ورودیComponents ngModule decorator نیازی به صراحت ندارید. زیرا angular کامپوننتها را هم از تعاریف @NgModule.bootstrap و هم مسیر را بهطور خودکار به اجزای ورودی اضافه میکند.
- +خیر. در نسخههای زاویهای قبلی، آرایه ورودی Components از ngModule decorator استفاده میشود تا به کامپایلر بگوید کدام مؤلفهها ایجاد شده و بهصورت پویا در view درج میشوند. در Angular9، این دیگر با Ivy مورد نیاز نیست.
- +خیر، فقط اجزای ورودی و اجزای قالب در بیلدهای تولید ظاهر می شوند. اگر یک جزء جزء ورودی نباشد و در یک الگو یافت نشود، تکان دهنده درخت آن را دور می اندازد. به همین دلیل، مطمئن شوید که فقط اجزای ورودی واقعی را برای کاهش اندازه بسته اضافه کنید.
- +کامپایلر Angular برای تبدیل کد برنامه به کد جاوا اسکریپت استفاده می شود. نشانگذاری الگو را میخواند، آن را با کد کلاس مؤلفه مربوطه ترکیب میکند و کارخانههای مؤلفه را منتشر میکند که نمایش جاوا اسکریپت مؤلفه را همراه با عناصر فراداده @Component ایجاد میکند.
- +ابرداده @NgModule
برای اینکه به کامپایلر Angular بگوید چه اجزایی برای این ماژول کامپایل شود و چگونه این ماژول را با ماژولهای دیگر پیوند دهد استفاده میشود.
کامپایلر Angular زمانی یک کامپوننت یا دستورالعمل را در قالب پیدا می کند که بتواند با انتخابگر آن کامپوننت یا دستورالعمل در آن الگو مطابقت داشته باشد. در حالی که اگر نام لوله در سینتکس لوله قالب HTML ظاهر شود، یک لوله پیدا می کند.
- +کتابخانه های اصلی زاویه ای و کتابخانه های شخص ثالث به عنوان ngmodules در دسترس هستند.
کتابخانه های زاویه ای مانند FormsModule ، HttpclientModule و Routermodule Ngmodules هستند.
بسیاری از کتابخانه های شخص ثالث مانند طراحی مواد ، یونی و AngularFire2 Ngmodules هستند.
ماژول های ویژگی Ngmodules هستند که به منظور سازماندهی کد استفاده می شوند. ماژول ویژگی را می توان با استفاده از دستور زیر در فهرست root با Angular CLI ایجاد کرد ،
ng generate module MyCustomFeature //
@@ -4909,19 +5150,19 @@ What are feature modules?
export class MyCustomFeature { }
Note: پسوند "ماژول" نباید در این نام وجود داشته باشد زیرا CLI آن را ضمیمه می کند.
- +در ماژول ویژگی CLI تولید شده ، دو بیانیه واردات JavaScript در بالای پرونده وجود دارد
NgModule: برای استفاده از دکوراتور `@ngmodule '
CommonModule: این دستورالعمل های متداول بسیاری مانند "ngif" و "ngfor" را ارائه می دهد.
در زیر تفاوت های اصلی بین Ngmodule زاویه ای و ماژول JavaScript وجود دارد:
دو خطای احتمالی متداول با آرایه اعلامیه وجود دارد:
اگر از یک مؤلفه بدون اعلام آن استفاده می کنید ، Angular یک پیام خطا را برمی گرداند.
اگر سعی می کنید در بیش از یک ماژول همان کلاس را اعلام کنید ، کامپایلر خطایی را منتشر می کند.
در زیر مراحل لازم برای استفاده از عناصر اعلامیه وجود دارد.
عنصر (مؤلفه ، دستورالعمل و لوله) را ایجاد کنید و آن را از پرونده ای که در آن نوشتید صادر کنید
آن را به ماژول مناسب وارد کنید.
آن را در آرایه اعلامیه ngmodule اعلام کنید.
اگر "BrowserModule" را به یک ماژول ویژگی بارگذاری شده تنبل وارد می کنید ، Angular خطایی را برمی گرداند که به شما می گوید در عوض از "CommonModule" استفاده کنید. از آنجا که ارائه دهندگان BrowserModule برای کل برنامه هستند ، بنابراین فقط باید در ماژول ریشه باشد ، نه در ماژول ویژگی. در حالی که ماژول های ویژگی فقط به دستورالعمل های مشترک در Commodule نیاز دارند.
- +در زیر پنج دسته ماژول های ویژگی ،
** دامنه: ** یک تجربه کاربر اختصاص داده شده به یک دامنه برنامه خاص (به عنوان مثال ، سفارش ، ثبت نام و غیره را قرار دهید)
** مسیریابی: ** اینها ماژول های ویژگی دامنه هستند که اجزای برتر آنها اهداف مسیرهای ناوبری روتر هستند.
** مسیریابی: ** پیکربندی مسیریابی را برای ماژول دیگر فراهم می کند.
** سرویس: ** این سرویس های نرم افزاری مانند دسترسی به داده ها و پیام رسانی را ارائه می دهد (به عنوان مثال ، httpclientmodule)
** ویجت: ** این مؤلفه ها ، دستورالعمل ها و لوله ها را در دسترس ماژول های خارجی قرار می دهد (به عنوان مثال ، کتابخانه های شخص ثالث مانند UI مواد)
ارائه دهنده دستورالعمل سیستم تزریق وابستگی در مورد چگونگی به دست آوردن ارزش برای وابستگی (خدمات با نام مستعار ایجاد شده) است. این سرویس را می توان با استفاده از Angular CLI به شرح زیر ارائه داد:
ng generate service my-service
@@ -5005,18 +5246,18 @@ What is a provider?
export class MyService {
}
-
+
شما همیشه باید خدمات خود را در انژکتور ریشه ارائه دهید مگر اینکه موردی وجود داشته باشد که بخواهید این سرویس فقط در صورت وارد کردن یک ngmodule خاص در دسترس باشد.
- +به جای آن می توان دامنه ارائه دهنده خدمات را به یک ماژول خاص محدود کرد و به جای آن در دسترس کل برنامه قرار گرفت. دو روش ممکن برای انجام آن وجود دارد.
Using providedIn in service:
import { Injectable } from '@angular/core'; @@ -5029,7 +5270,7 @@How do you restrict provider scope to a module?
}
Declare provider for the service in module:
import { NgModule } from '@angular/core'; @@ -5042,13 +5283,13 @@- +How do you restrict provider scope to a module?
export class SomeModule { }
دو روش ممکن برای ارائه یک سرویس مجرد وجود دارد.
ویژگی ارائه شده از injectable () را روی "ریشه" تنظیم کنید. این روش ارجح (شروع از Angular 6.0) از ایجاد یک سرویس Singleton است زیرا خدمات شما را لرزان می کند.
import { Injectable } from '@angular/core'; @@ -5060,7 +5301,7 @@How do you provide a singleton service?
}
سرویس را در ماژول root یا در یک ماژول که فقط توسط ماژول ریشه وارد می شود ، وارد کنید. از آن برای ثبت خدمات قبل از Angular 6.0 استفاده شده است.
@NgModule({ @@ -5069,25 +5310,25 @@- +How do you provide a singleton service?
// ... })
اگر یک ماژول تعریف و اعلامیه ها را تعریف کند ، بارگیری ماژول در ماژول های چند ویژگی ، ثبت نام سرویس را کپی می کند. در زیر روشهای مختلفی برای جلوگیری از این رفتار تکراری آورده شده است.
به جای ثبت سرویس در ماژول ، از نحو ارائه شده استفاده کنید.
خدمات خود را در ماژول خود جدا کنید.
روشهای Forroot () و Forchild () را در ماژول تعریف کنید.
اگر ماژول «Routermodule» روش استاتیک Forroot () ندارد ، هر ماژول ویژگی یک نمونه روتر جدید را فوری می کند ، که به دلیل موارد تکراری منجر به کاربرد شکسته می شود. پس از استفاده از روش forroot () ، ماژول برنامه root routermodule.forroot (...)
را وارد می کند و روتر می شود و همه ماژول های ویژگی واردات routermodule.forchild (...)
که روتر دیگری را فوری نمی کند.
ماژول مشترک ماژولی است که در آن دستورالعمل ها ، لوله ها و اجزای متداول را در یک ماژول که به اشتراک گذاشته شده است (وارد می کنید) در طول برنامه قرار دهید.
به عنوان مثال ، ماژول مشترک زیر واردات متداول ، formsmodule برای دستورالعمل های مشترک و مؤلفه ها ، لوله ها و دستورالعمل ها بر اساس نیاز ،
@@ -5106,15 +5347,15 @@نه ، توصیه نمی شود با وارد کردن ماژول خدمات را به اشتراک بگذارید. یعنی ماژول ها را وارد کنید وقتی می خواهید فقط از دستورالعمل ها ، لوله ها و مؤلفه ها استفاده کنید. بهترین روش برای به دست آوردن خدمات مشترک از طریق "تزریق وابستگی زاویه ای" است زیرا وارد کردن یک ماژول منجر به یک نمونه خدمات جدید خواهد شد.
- +در زاویه 9.1 ، می توان از روش API "getLocalEdirection" برای به دست آوردن جهت فعلی در برنامه خود استفاده کرد. این روش برای پشتیبانی از مناطق راست به چپ برای برنامه های مبتنی بر بین المللی شما مفید است.
import { getLocaleDirection, registerLocaleData } from '@angular/common'; @@ -5131,10 +5372,10 @@- +How do you get current direction for locales?
// Current direction is used to provide conditional logic here }
NGCC (کامپایلر سازگاری زاویه ای) ابزاری است که Node_Module را با NDEDULE با NDIV NGC به قالب سازگار با پیچک ساخته می کند. اسکریپت postinstall
از pack.json مطمئن خواهد شد که node_modules شما با رندر پیچک سازگار خواهد بود.
"scripts": { @@ -5142,31 +5383,31 @@What is ngcc?
}
Whereas, Ivy compiler (ngtsc), which compiles Ivy-compatible code.
- +انواع کلاس زیر نباید به اعلامیه ها اضافه شود
کلاس که قبلاً در هر ماژول دیگری اعلام شده است.
دستورالعمل های وارد شده از یک ماژول دیگر.
کلاس های ماژول.
کلاسهای خدمات.
کلاس ها و اشیاء غیر حرکتی ، مانند رشته ها ، اعداد ، توابع ، مدل های موجودیت ، تنظیمات ، منطق تجارت و کلاس های یاور.
Angular خدماتی به نام NGZONE را ارائه می دهد که منطقه ای به نام "Angular" ایجاد می کند تا در صورت رضایت از شرایط زیر ، به طور خودکار تشخیص تغییر را ایجاد کند.
هنگامی که یک عملکرد همگام سازی یا ASYNC اجرا می شود.
هنگامی که هیچ برنامه ریزی میکروتاسکی برنامه ریزی نشده است.
منطقه به طور پیش فرض در برنامه های زاویه ای بارگیری و مورد نیاز است و به زاویه کمک می کند تا بداند چه موقع باعث تشخیص تغییر می شود. به این ترتیب ، این باعث می شود که توسعه دهندگان Sures روی توسعه برنامه و نه اصلی ترین قسمت زاویه ای متمرکز شوند. همچنین می توانید از Angular بدون منطقه استفاده کنید اما تشخیص تغییر باید به تنهایی اجرا شود و «Zone Zone» باید در فرآیند bootstrap پیکربندی شود. @@ -5199,20 +5440,20 @@What is NoopZone?
به طور پیش فرض ، Angular CLI مؤلفه هایی را در یک حالت نمایش داده شده درون خطی ایجاد می کند (یعنی صفحه نمایش: درون خطی). اما ایجاد مؤلفه هایی با نمایشگر امکان پذیر است: سبک بلوک با استفاده از گزینه "DisplayBlock":
ng generate component my-component --displayBlock
(OR) the option can be turned on by default in Angular.json with schematics.@schematics/angular:component.displayBlock
key value as true.
تشخیص تغییر در سناریوهای زیر کار می کند که در آن داده ها برای به روزرسانی برنامه HTML نیاز دارند.
ApplicationRef.tick ()
برای تماس با تشخیص تغییر و مشاهده.** اولیه سازی مؤلفه: ** در حالی که راه اندازی کاربرد زاویه ای ، زاویه ای باعث می شود ApplicationRef.tick ()
برای تماس با تشخیص تغییر و مشاهده.
** شنونده رویداد: ** شنونده رویداد DOM می تواند داده ها را در یک مؤلفه زاویه ای به روز کند و باعث تغییر در تغییر نیز شود.
@Component({ @@ -5230,7 +5471,7 @@What are the possible data update scenarios for change detection?
}
HTTP Data Request: می توانید از طریق درخواست HTTP داده ها را از یک سرور دریافت کنید
data = 'default value'; @@ -5243,7 +5484,7 @@What are the possible data update scenarios for change detection?
}
Macro tasks setTimeout() or setInterval(): می توانید داده ها را در عملکرد پاسخ به تماس SettimeOut یا SetInterval به روز کنید
data = 'default value'; @@ -5255,7 +5496,7 @@What are the possible data update scenarios for change detection?
}
Micro tasks Promises: شما می توانید داده ها را در عملکرد پاسخ به قول وعده به روز کنید
data = 'initial value'; @@ -5267,12 +5508,12 @@What are the possible data update scenarios for change detection?
}
Async operations like Web sockets and Canvas: داده ها را می توان به صورت ناهمزمان با استفاده از websocket.onmessage () و canvas.toblob () به روز کرد.
زمینه اجرای یک مفهوم انتزاعی است که اطلاعات مربوط به محیط را در کد فعلی اجرا می کند. یک منطقه زمینه اعدام را فراهم می کند که در عملیات ناهمزمان ادامه می یابد ، به عنوان زمینه منطقه خوانده می شود. به عنوان مثال ، زمینه منطقه در عملکرد برگشت به تماس در خارج و داخل SettimeOut یکسان خواهد بود ،
zone.run(() => { @@ -5285,13 +5526,13 @@What is a zone context?
});
The current zone is retrieved through Zone.current
.
چهار قلاب چرخه عمر برای عملیات ناهمزمان از Zone.js. وجود دارد.
onScheduleTask: این قلاب هنگام برنامه ریزی یک کار ناهمزمان جدید ایجاد می شود. به عنوان مثال ، وقتی با SetTimeOut تماس می گیرید ()
onScheduleTask: function(delegate, curr, target, task) { @@ -5300,7 +5541,7 @@What are the lifecycle hooks of a zone?
}
onInvokeTask: این قلاب هنگامی که یک کار ناهمزمان در حال انجام است ، ایجاد می کند. به عنوان مثال ، هنگامی که پاسخ به تماس SettimeOut () در حال اجرا است.
onInvokeTask: function(delegate, curr, target, task, applyThis, applyArgs) { @@ -5309,7 +5550,7 @@What are the lifecycle hooks of a zone?
}
onHasTask: این قلاب هنگامی که وضعیت یک نوع کار در داخل یک منطقه از پایدار (بدون کار در منطقه) به ناپایدار تغییر می کند (یک کار جدید در منطقه برنامه ریزی شده است) یا از ناپایدار تا پایدار تغییر می کند.
onHasTask: function(delegate, curr, target, hasTaskState) { @@ -5318,7 +5559,7 @@What are the lifecycle hooks of a zone?
}
onInvoke: این قلاب هنگامی که یک عملکرد همزمان در منطقه اجرا می شود ، ایجاد می شود.
onInvoke: function(delegate, curr, target, callback, applyThis, applyArgs) { @@ -5326,10 +5567,10 @@- +What are the lifecycle hooks of a zone?
return delegate.invoke(target, callback, applyThis, applyArgs); }
سرویس NGZONE یک روش `run () را ارائه می دهد که به شما امکان می دهد عملکردی را در داخل منطقه زاویه ای اجرا کنید. این عملکرد برای اجرای API های شخص ثالث که توسط منطقه اداره نمی شوند و باعث تشخیص تغییر خودکار در زمان صحیح می شوند ، استفاده می شود.
export class AppComponent implements OnInit { @@ -5358,10 +5599,10 @@- +What are the methods of NgZone used to control change detection?
} }
شما می توانید با پیکربندی آنها در یک پرونده جداگانه ، تنظیمات منطقه را تغییر داده و درست پس از واردات Zonejs وارد کنید.
به عنوان مثال ، شما می توانید Patch Monkey RequestAnimationFrame () را غیرفعال کنید تا از تغییر برای به روزرسانی داده به عنوان یک تنظیم جلوگیری کنید و از وقایع DOM (یک رویداد Mousemove یا Scroll) جلوگیری کنید تا تغییر تغییر را ایجاد کند. بیایید بگوییم پرونده جدید به نام Zone-flags.js ،
Angular یک عملکرد "ماشه ()" برای انیمیشن را به منظور جمع آوری حالت ها و انتقال با یک نام انیمیشن خاص فراهم می کند تا بتوانید آن را به عنصر تحریک در الگوی HTML وصل کنید. این عملکرد را برای تغییرات تماشا می کند و هنگام تغییر ، اقدامات را آغاز می کند.
به عنوان مثال ، بیایید Trigger به نام "Updown" ایجاد کنیم و آن را به عنصر دکمه وصل کنیم.
با تعیین مقدار ابرداده می توانید انژکتورها را با ارائه دهندگان در سطوح مختلف برنامه خود پیکربندی کنید. پیکربندی می تواند در یکی از سه مکان اتفاق بیفتد ،
@Injectable()
decorator for the service itself@NgModule()
decorator for an NgModule@Component()
decorator for a componentIn the @Injectable()
decorator for the service itself
In the @NgModule()
decorator for an NgModule
In the @Component()
decorator for a component
نه. اگر کلاس دارای دکوراتورهای زاویه ای دیگری بر روی آن باشد یا هیچ وابستگی نداشته باشد ، دکوراتور injectable ()
`injectable () لازم نیست. اما نکته مهم در اینجا هر کلاس است که با زاویه تزریق می شود تزئین شده است.
یعنی اگر دکوراتور را اضافه کنیم ، ابرداده "طراحی: پارامترها" اضافه می شود ، و تزریق وابستگی می تواند کار خود را انجام دهد. این دلیل دقیق اضافه کردن دکوراتور injectable () در یک سرویس در صورتی است که این سرویس دارای برخی وابستگی ها باشد.
به عنوان مثال ، بیایید تغییرات مختلف AppService را در یک جزء ریشه مشاهده کنیم ،
AppService زیر را می توان بدون هیچ مشکلی در AppComponent تزریق کرد. این امر به این دلیل است که هیچ سرویس وابستگی در AppService وجود ندارد.
export class AppService { @@ -5449,7 +5690,7 @@Is it mandatory to use injectable on every service class?
}
AppService زیر با دکوراتور ساختگی و Httpservice می تواند بدون هیچ مشکلی در AppComponent تزریق شود. این امر به این دلیل است که اطلاعات متا با دکوراتور ساختگی تولید می شود.
function SomeDummyDecorator() { @@ -5478,7 +5719,7 @@Is it mandatory to use injectable on every service class?
exports.AppService = AppService;
AppService زیر با تزئینات injectable و httpservice می تواند بدون هیچ مشکلی در AppComponent تزریق شود. این امر به این دلیل است که اطلاعات متا با تزئینات تزریقی تولید می شود.
@Injectable({ @@ -5490,10 +5731,10 @@- +Is it mandatory to use injectable on every service class?
} }
وابستگی اختیاری یک دکوراتور پارامتر است که در پارامترهای سازنده مورد استفاده قرار می گیرد ، که این پارامتر را به عنوان یک وابستگی اختیاری نشان می دهد. به همین دلیل ، در صورت عدم یافتن وابستگی ، چارچوب DI تهی را تهی می کند.
به عنوان مثال ، اگر شما یک ارائه دهنده logger را در هیچ کجا ثبت نکنید ، انژکتور مقدار logger (یا سرویس logger) را در کلاس زیر تنظیم می کند.
There are two types of injector hierarchies in Angular
ModuleInjector hierarchy: آن را با استفاده از حاشیه نویسی ngmodule () یا injectable () در سطح ماژول پیکربندی می کند.
**ElementInjector hierarchy:**این به طور ضمنی در هر عنصر DOM ایجاد کرد. همچنین به طور پیش فرض خالی است ، مگر اینکه آن را در ویژگی ارائه دهندگان در Directive () یا component () پیکربندی کنید.
فرم های واکنشی یک رویکرد مدل محور برای ایجاد فرم ها به سبک واکنشی است (ورودی های فرم با گذشت زمان تغییر می کنند). اینها در اطراف جریانهای قابل مشاهده ساخته شده اند ، جایی که ورودی ها و مقادیر فرم به عنوان جریان مقادیر ورودی ارائه می شوند. بیایید مراحل زیر را برای ایجاد فرم های واکنشی دنبال کنیم ،
ماژول فرم های واکنشی را ثبت کنید که دستورالعمل های واکنش پذیر را در برنامه شما اعلام می کند
import { ReactiveFormsModule } from '@angular/forms'; @@ -5536,7 +5777,7 @@What are reactive forms?
export class AppModule { }
یک نمونه جدید FormControl ایجاد کنید و آن را در مؤلفه ذخیره کنید.
import { Component } from '@angular/core'; @@ -5551,7 +5792,7 @@What are reactive forms?
}
FormControl را در الگوی ثبت کنید.
<label> @@ -5578,19 +5819,19 @@- +What are reactive forms?
userName = new FormControl(''); }
فرم های پویا الگویی است که در آن ما یک فرم را به صورت پویا بر اساس ابرداده می سازیم که یک مدل شی تجاری را توصیف می کند. می توانید آنها را بر اساس API فرم واکنشی ایجاد کنید.
- +فرم های محور الگوی فرم های مدل محور هستند که در آن می نویسید که منطق ، اعتبار سنجی ، کنترل و غیره را در قسمت الگوی کد با استفاده از دستورالعمل ها می نویسید. آنها برای سناریوهای ساده مناسب هستند و از اتصال دو طرفه با نحو [(ngmodel)] استفاده می کنند.
به عنوان مثال ، می توانید با دنبال کردن مراحل ساده زیر ، فرم ثبت را به راحتی ایجاد کنید ،
FormsModule را در آرایه واردات ماژول برنامه وارد کنید
import { BrowserModule } from '@angular/platform-browser'; @@ -5612,7 +5853,7 @@What are template driven forms?
export class AppModule { }
با استفاده از نحو ngmodel فرم را از الگوی به مؤلفه وصل کنید
<input type="text" class="form-control" id="name"
@@ -5620,13 +5861,13 @@ What are template driven forms?
[(ngModel)]="model.name" name="name">
برای ایجاد نمونه های FormControl و ثبت آنها ، دستورالعمل NGFORM را به برچسب
<form #registerForm="ngForm">
پیام اعتبار سنجی را برای کنترل فرم اعمال کنید
<label for="name">Name</label> @@ -5640,7 +5881,7 @@What are template driven forms?
</div>
بیایید فرم را با دستورالعمل ngsubmit ارسال کنیم و دکمه نوع = "ارسال" را در پایین فرم اضافه کنیم تا فرم ارسال شود.
<form (ngSubmit)="onSubmit()" #heroForm="ngForm"> @@ -5667,10 +5908,10 @@- +What are template driven forms?
</form> </div>
در زیر تفاوت های اصلی بین اشکال واکنشی و فرم های محور الگو وجود دارد @@ -5688,10 +5929,10 @@What are the differences between reactive forms and template driven forms?
اشکال واکنشی دو روش برای گروه بندی چندین کنترل مرتبط را ارائه می دهد.
** FormGroup **: یک فرم را با مجموعه ای از کنترل های ثابت تعریف می کند که می توانند در یک شیء با هم مدیریت شوند. این ویژگی ها و روش های مشابه مشابه با یک نمونه FormControl است.
این فرم گروه می تواند برای ایجاد اشکال پیچیده مانند شکل زیر توخالی شود.
@@ -5760,7 +6001,7 @@** FormArray:** یک فرم پویا را در قالب آرایه تعریف می کند ، جایی که می توانید کنترل ها را در زمان اجرا اضافه و حذف کنید. این امر برای اشکال پویا مفید است وقتی نمی دانید چه تعداد کنترل در گروه وجود خواهد داشت.
import { Component } from '@angular/core'; @@ -5823,10 +6064,10 @@- +What are the different ways to group form controls?
</div> </form>
برای به روزرسانی خصوصیات خاص تعریف شده در مدل فرم می توانید از روش `patchValue () استفاده کنید. به عنوان مثال ، می توانید نام و خیابان مشخصات خاص را با کلیک بر روی دکمه Update همانطور که در زیر آمده است ، به روز کنید.
updateProfile() { @@ -5843,10 +6084,10 @@How do you update specific properties of a form model?
You can also use setValue
method to update properties.
Note: Remember to update the properties against the exact model structure.
- +FormBuilder به عنوان شکر نحوی برای ایجاد آسان نمونه هایی از یک فرمل ، فرم گروه یا فرم آررای استفاده می شود. این برای کاهش میزان دیگ بخار مورد نیاز برای ساخت اشکال واکنشی پیچیده مفید است. این به عنوان یک کلاس یاور تزریقی بسته `@angular/forms" در دسترس است.
For example, the user profile component creation becomes easier as shown here.
@@ -5864,10 +6105,10 @@شما می توانید یک ویژگی دریافت کننده (بیایید بگوییم ، تشخیصی) را در داخل مؤلفه اضافه کنید تا یک نمایش JSON از مدل را در طول توسعه بازگرداند. این برای تأیید اینکه آیا مقادیر واقعاً از جعبه ورودی به مدل جریان دارند و برعکس یا خیر ، مفید است.
export class UserProfileComponent { @@ -5885,10 +6126,10 @@- +How do you verify the model changes in forms?
// FormControls goes here </div>
دستورالعمل NGMODEL کنترل فرم را با کلاسهای ویژه CSS زاویه ای به روز می کند تا وضعیت آن را منعکس کند. بیایید لیست کلاس ها را با فرمت جدولی پیدا کنیم ،
در یک فرم مدل محور ، می توانید فرم را فقط با فراخوانی تابع "تنظیم مجدد ()" در مدل فرم ما تنظیم کنید. @@ -5944,11 +6185,11 @@How do you reset the form?
در اشکال واکنشی ، اعتبار سنج ها می توانند توابع همزمان یا ناهمزمان باشند ،
** اعتبار سنجی همگام سازی: ** این توابع همزمان هستند که نمونه کنترل را می گیرند و بلافاصله مجموعه ای از خطاهای اعتبار سنجی یا تهی را برمی گردانند. همچنین ، این توابع ضمن فوری کنترل فرم ، به عنوان آرگومان دوم تصویب شدند. موارد اصلی استفاده ، چک های ساده ای هستند مانند اینکه آیا یک میدان خالی است ، خواه از حداکثر طول و غیره باشد.
** اعتبار سنج های Async: ** این توابع ناهمزمان هستند که نمونه کنترل را می گیرند و یک وعده یا قابل مشاهده را باز می گردانند که بعداً مجموعه ای از خطاهای اعتبار سنجی یا تهی را منتشر می کند. همچنین ، این توابع ضمن فوری کنترل فرم ، به عنوان آرگومان دوم تصویب شدند. موارد اصلی استفاده ، اعتبارسنجی پیچیده مانند ضربه زدن به سرور برای بررسی در دسترس بودن نام کاربری یا ایمیل است.
The representation of these validators looks like below
@@ -5958,10 +6199,10 @@n فرم های واکنشی ، می توانید از اعتبار سنجی داخلی مانند "مورد نیاز" و "minl طول" در کنترل فرم ورودی خود استفاده کنید. به عنوان مثال ، فرم ثبت نام می تواند این اعتبار سنج ها را در قسمت ورودی نام داشته باشد
this.registrationForm = new FormGroup({ @@ -5972,28 +6213,28 @@Can you give an example of built-in validators?
});
در حالی که در فرم های الگوی محور ، هر دو اعتبار سنجی «مورد نیاز» و `minl طول به عنوان ویژگی ها موجود است.
- +از آنجا که همه اعتبار سنج ها پس از هر تغییر ارزش فرم اجرا می شوند ، با ضربه زدن به API خارجی در هر کلید ، تأثیر عمده ای بر عملکرد با اعتبار سنج های ASYNC ایجاد می کند. این وضعیت را می توان با تأخیر در اعتبار فرم با تغییر ویژگی UpdateON از تغییر (پیش فرض) برای ارسال یا تاری ، از آن جلوگیری کرد.
استفاده بر اساس انواع فرم متفاوت خواهد بود.
ngModelOptions
directiveTemplate-driven forms: Set the property on ngModelOptions
directive
<input [(ngModel)]="name" [ngModelOptions]="{updateOn: 'blur'}">
Reactive-forms: Set the property on FormControl instance
name = new FormControl('', {updateOn: 'blur'});- +
بعضی اوقات ممکن است شما نیاز به NGFOR و NGIF در همان عنصر داشته باشید اما متأسفانه قصد دارید در زیر خطای الگو با آن روبرو شوید.
Template parse errors: Can't have multiple template bindings on one element.
@@ -6013,10 +6254,10 @@ How to set ngFor and ngIf on the same element?
</ul>
</ng-container>
-
+
از انتخاب کننده شبه کلاس "میزبان" برای هدف قرار دادن سبک های موجود در عنصری که میزبان مؤلفه است استفاده می شود. از آنجا که عنصر میزبان در الگوی مؤلفه والدین قرار دارد ، شما نمی توانید از طریق سایر مؤلفه ها به وسیله دیگر به عنصر میزبان برسید.
به عنوان مثال ، شما می توانید یک مرز برای عنصر والدین ایجاد کنید ، همانطور که در زیر وجود دارد ،
در Angular ، یک ویژگی url از بسته روتر برای رسیدن به مسیر فعلی وجود دارد. شما باید چند مرحله زیر را دنبال کنید ،
Import Router from @angular/router
import { Router } from '@angular/router';
Inject router inside constructor
constructor(private router: Router ) { @@ -6048,32 +6289,32 @@How do you get the current route?
}
Access url parameter
console.log(this.router.url); // /routename- +
مهار مؤلفه یک API آزمایش در اطراف یک دستورالعمل یا مؤلفه زاویه ای است تا با مخفی کردن جزئیات اجرای از مجموعه های آزمایش ، تست ها را ساده تر کند. این می تواند بین تست های واحد ، تست های ادغام و تست های پایان به پایان به اشتراک گذاشته شود. ایده برای مهارهای مؤلفه از الگوی ** pageObject ** که معمولاً برای آزمایش ادغام استفاده می شود ، حاصل می شود.
- +در طول زمان کامپایل ، Angular CLI فونت هایی را که برنامه شما از آن استفاده می کند ، بارگیری و درون خطی می کند. این به روزرسانی عملکرد اولین رنگ محتوا (FCP) را سرعت می بخشد و این ویژگی به طور پیش فرض در برنامه های ساخته شده با نسخه 11 فعال می شود.
- +طرح ریزی محتوا الگویی است که در آن شما محتوای مورد نظر خود را در داخل یک مؤلفه دیگر وارد می کنید یا پروژه می کنید.
- +از Content NG برای وارد کردن محتوا به صورت پویا در مؤلفه استفاده می شود که به افزایش قابلیت استفاده مجدد مؤلفه کمک می کند.
- +