یک نکتهی تکمیلی: ترکیب ngIf و ngFor بر روی یک المان
فرض کنید میخواهید در همان حالیکه عنصری را در طی یک حلقه نمایش میدهید، از همان آیتم جاری برای تشخیص یکی از خاصیتهای آن نیز استفاده کنید:
یک چنین ترکیبی در Angular مجاز نیست و راه حل پیشنهاد شدهی آن استفاده از ng-container است:
مزیت مهم آن عدم درج ng-container در DOM است. برای مثال قصد نداریم یک div اضافی را داخل تعاریف یک جدول قرار دهیم و آنرا از شکل استاندارد خارج کنیم.
فرض کنید میخواهید در همان حالیکه عنصری را در طی یک حلقه نمایش میدهید، از همان آیتم جاری برای تشخیص یکی از خاصیتهای آن نیز استفاده کنید:
<td *ngFor="let item of headerItems" *ngIf="item.visible">{{ item?.name }}</td>
<ng-container *ngFor="let item of headerItems"> <td *ngIf="item.visible">{{ item?.name }}</td> </ng-container>
نظرات مطالب
تغییرات رمزنگاری اطلاعات در NET Core.
یک نکتهی تکمیلی: ساده شدن روش کار با الگوریتمهای هش از دات نت 5 به بعد
همانطور که در این مطلب مشاهده کردید، برای محاسبهی هش SHA256، روش توصیه شده به صورت زیر درآمدهاست:
using System.Security.Cryptography; byte[] data = default; // Some data using (SHA256 hash = SHA256.Create()) { byte[] digest = hash.ComputeHash(data); }
using System.Security.Cryptography; byte[] data = default; // Some data byte[] digest = SHA256.HashData(data);
مزیت این روش نه فقط ساده شدن آن و یا حذف نیاز به using است، بلکه کاهش تعداد تخصیصهای حافظهی آن نیز هست. یک چنین API ای در دات نت 6 برای HMAC نیز تهیه شدهاست. همچنین برای نمونه الگوریتم هش کردن PBKDF2 در دات نت 6 به صورت زیر ساده شدهاست:
using System.Security.Cryptography; byte[] salt = RandomNumberGenerator.GetBytes(32); byte[] prk = Rfc2898DeriveBytes.Pbkdf2( userPassword, salt, iterations: 200_000, HashAlgorithmName.SHA256, outputLength: 32);
نظرات مطالب
استفاده از چندین Context در EF 6 Code first
با سلام
من از EF 5 dbfirst به صورت Context های جداگانه در پروژههای وب جدا استفاده کردم و در نهایت تمامی این assembly ها را در یک وب سایت publish میکنم . در صورتی که از یک Entity به صورت مشترک در 2 context استفاده کرده باشم با خطای زیر
با تشکر
من از EF 5 dbfirst به صورت Context های جداگانه در پروژههای وب جدا استفاده کردم و در نهایت تمامی این assembly ها را در یک وب سایت publish میکنم . در صورتی که از یک Entity به صورت مشترک در 2 context استفاده کرده باشم با خطای زیر
System.Data.MetadataException: Schema specified is not valid. Errors: Multiple types with the name 'Customer' exist in the EdmItemCollection in different namespaces . Convention based mapping requires unique names without regard to namespace in the EdmItemCollection
مواجه میشم . با اینکه Assembly های مربوط به Contextها متفاوت هست اما با این خطا روبرو میشم . آیا قابلیت گفته شده در EF 6 این مشکل برطرف شده است ؟ و یا در ef 5 راهکاری برای این مشکل وجود ندارد ؟
jQuery نسخهی 1.9 و 2.0 بتا منتشر شدند. در این نسخه ها، تغییرات گسترده ای رخ داده که اگر به اونها دقت نشه، کدهای زیادی رو از کار میندازن. jQuery 1.9 همچنان بر روی IE 6,7,8 اجرا میشه اما در jQuery 2.0، این پشتیبانی حذف شده.
تیم توسعهی jQuery، امروز همزمان با ارائهی نسخههای 1.9 و 2.0 بتا، پلاگینی با نام jQuery Migrate رو هم منتشر کرد که حاوی متدهای حذف شده در نسخههای 1.9 و 2.0 هست تا مهاجرت به نسخههای جدید، باعث از کار افتادن کدهای قدیمی نشه و پس از مهاجرت کامل کدها، میتونید jQuery Migrate رو حذف کنید. کار خوبی که انجام شده این هست که jQuery Migrate از طریق Console بهتون اطلاع میده که در کدها از فلان متد منسوخ یا حذف شده استفاده شده.
اگر یک برنامهی Angular را به صورت پیشفرض در IE اجرا کنیم، یک چنین تصویری مشاهده خواهد شد:
برای اجرای برنامه توسط نگارشهای مختلف IE میتوانید برنامهی IE Tester را نصب کنید.
مشکل چیست؟
مشکل عدم اجرای برنامههای Angular در IE، به قدیمی بودن موتور JavaScript آن بر میگردد؛ خصوصا در مورد توابع کار با آرایهها. برای مثال در مورد کار با for..of هیچ نوع پشتیبانی از آن در IE وجود ندارد (و نخواهد داشت؛ با توجه به پایان دورهی پشتیبانی آن):
چگونه پشتیبانی از ویژگیهای جدید JavaScript را به مرورگر IE اضافه کنیم؟
Angular امکان افزودن کمبودهای موتور JavaScript پیشفرض IE را توسط کتابخانهی core-js میسر کردهاست که اصطلاحا به آن polyfills گفته میشود. برای این منظور فایل src\polyfills.ts را گشوده و تغییرات زیر را به آن اعمال کنید:
الف) در این فایل، هرجایی import // وجود دارد، آنرا تبدیل به import کنید (تمام importهایی که کامنت شدهاند را از حالت کامنت خارج کنید).
ب) دو بستهی زیر را نیز باید نصب کنید:
البته اگر به کامنتهای این فایل دقت کنید، نیاز به نصب این بستهها نیز در آن عنوان شدهاست.
نتیجهی نهایی پس از افزودن polyfills مخصوص IE
اکنون اگر مجددا برنامه را کامپایل و اجرا کنید، برنامهی Angular بدون مشکل در IE اجرا خواهد شد:
برای اجرای برنامه توسط نگارشهای مختلف IE میتوانید برنامهی IE Tester را نصب کنید.
مشکل چیست؟
مشکل عدم اجرای برنامههای Angular در IE، به قدیمی بودن موتور JavaScript آن بر میگردد؛ خصوصا در مورد توابع کار با آرایهها. برای مثال در مورد کار با for..of هیچ نوع پشتیبانی از آن در IE وجود ندارد (و نخواهد داشت؛ با توجه به پایان دورهی پشتیبانی آن):
چگونه پشتیبانی از ویژگیهای جدید JavaScript را به مرورگر IE اضافه کنیم؟
Angular امکان افزودن کمبودهای موتور JavaScript پیشفرض IE را توسط کتابخانهی core-js میسر کردهاست که اصطلاحا به آن polyfills گفته میشود. برای این منظور فایل src\polyfills.ts را گشوده و تغییرات زیر را به آن اعمال کنید:
الف) در این فایل، هرجایی import // وجود دارد، آنرا تبدیل به import کنید (تمام importهایی که کامنت شدهاند را از حالت کامنت خارج کنید).
ب) دو بستهی زیر را نیز باید نصب کنید:
npm install --save classlist.js npm install --save web-animations-js
نتیجهی نهایی پس از افزودن polyfills مخصوص IE
اکنون اگر مجددا برنامه را کامپایل و اجرا کنید، برنامهی Angular بدون مشکل در IE اجرا خواهد شد:
به هیچ وجه نمیتوان خطاهای رخ داده در این بخش را catch کرد؟
در نظرات قبلی عنوان شد: «... در همان فایل ScannerService اگر catch را به این صورت تغییر دهید ...»
چند نکتهی تکمیلی
- با معرفی TypeScript 2.0، امکان سادهتری برای تعاریف فایلهای typings و دریافت آنها ارائه شدهاست. اطلاعات بیشتر
- همچنین یک سری کتابخانهی پیشفرض را در هم در فایل tsconfig.json میتوان مقدار دهی کرد:
معرفی es2015.promise به صورت خودکار خطای «'Cannot find name 'Promise » را برطرف میکند. اطلاعات بیشتر
- با معرفی TypeScript 2.0، امکان سادهتری برای تعاریف فایلهای typings و دریافت آنها ارائه شدهاست. اطلاعات بیشتر
- همچنین یک سری کتابخانهی پیشفرض را در هم در فایل tsconfig.json میتوان مقدار دهی کرد:
{ "compilerOptions": { "module": "commonjs", "target": "es5", "noImplicitAny": true, "strictNullChecks": true, "lib": [ "dom", "es5", "es2015.promise" ] } }