مطالب
StyleCop 4.3.1.3
به روز رسانی جدید StyleCop و یا همان ابزار استاندارد سازی و یکنواخت کردن ظاهر کدهای نوشته شده که پیشتر در تیمهای داخلی مایکروسافت مورد استفاده قرار میگرفت، از آدرس زیر قابل دریافت است.
همچنین نگارش جدید StyleCop for ReSharper را نیز میتوانید از آدرس زیر دریافت نمائید.
پاسخ به بازخوردهای پروژهها
عدم سازگاری با EF
- یک مثال جدید Entity framework که در آن lazy loading و dynamic proxies فعال است به مجموعه مثالهای PdfReport اضافه کردم: (^)
- همچنین برای اینکه dynamic proxies سبب بروز stack overflow exception نشود نحوه استخراج خواص تو در تو توسط پارامتر dumpLevel محدود شد. به این ترتیب وجود dynamic proxies سبب نخواهد شد تا کلاسهایی که به یکدیگر ارجاع دارند n میلیون بار توسط EF وهله سازی شوند!
این تغییرات فعلا در SVN موجود هستند.
- همچنین برای اینکه dynamic proxies سبب بروز stack overflow exception نشود نحوه استخراج خواص تو در تو توسط پارامتر dumpLevel محدود شد. به این ترتیب وجود dynamic proxies سبب نخواهد شد تا کلاسهایی که به یکدیگر ارجاع دارند n میلیون بار توسط EF وهله سازی شوند!
این تغییرات فعلا در SVN موجود هستند.
بازخوردهای پروژهها
راهنمایی در مورد تحلیل محصول و قیمت
سلام . تشکر بابت پروژه هایی که منتشر میکنید .
آقای ربال ، ببینید در مورد محصول و قیمت درست متوجه شدم ؟
یک رابطه یک به چند بین محصول و قیمت وجود دارد که یکی از مزیتهای این میتونه نمودار بالا پایین تغییرات قیمت محصول باشه . آیا آخرین قیمت رو شما در جدول Product ذخیره میکنید ؟ به نظر شما بهتر است در جدول Product ذخیره شود و یا در جدول Price ؟
ممنون
آقای ربال ، ببینید در مورد محصول و قیمت درست متوجه شدم ؟
یک رابطه یک به چند بین محصول و قیمت وجود دارد که یکی از مزیتهای این میتونه نمودار بالا پایین تغییرات قیمت محصول باشه . آیا آخرین قیمت رو شما در جدول Product ذخیره میکنید ؟ به نظر شما بهتر است در جدول Product ذخیره شود و یا در جدول Price ؟
ممنون
فایلهای پروژهها
MvcFileManager.rar
نسخه اصلاحی آقای وکیلی:
تغییر در نوع چینش models
افزودن PlUploader برای آپلود فایل
تغییر در Partial به نام _breadCrumb
امکان چند انتخاب هم زمان - و همچنین حذف چند مورد هم زمان
باز شدن پوشهها و دانلود شدن فایلها با دابل کلیک
تغییرات مختصر در style
تغییر در ساختار لینک برگشت -> انتقال از model به view و پیاده سازی با jquery به دلیل سهولت بیشتر
مسیرراهها
کوئری نویسی در EF Core
فایرفاکس و کروم بیشتر به دلیل محبوبیت و پیشرو بودنشون مورد استفاده قرار میدم ولی چون مرورگر شخصی خودم فایرفاکسه ، بیشتر هم با همون کار میکنم ولی کروم هم باشه بد نیست. بیشتر دلایل علاقه ای و هم اینکه ابزارهای خوبی هم ارائه میدن.
با اینکه Edge هم تغییرات اساسی داشته ولی عملا یا دیر به بازار اومده یا اینکه کلا باز مثل قبل به اون شکل پذیرفتنی نیست، به نظرم از لحاظ رابط و UX راه زیادی داره و حتی باز ممکنه در آخر پذیرفته نشه.
با اینکه Edge هم تغییرات اساسی داشته ولی عملا یا دیر به بازار اومده یا اینکه کلا باز مثل قبل به اون شکل پذیرفتنی نیست، به نظرم از لحاظ رابط و UX راه زیادی داره و حتی باز ممکنه در آخر پذیرفته نشه.
نظرات نظرسنجیها
آیا به یادگیری یا ادامهی استفاده از AngularJS خواهید پرداخت؟
به نظرم در کنار ایراد هایی که به Angular وارد میشود در حال حاضر کاملترین فریم ورک به همراه مستندات فراوان است . اگر بخواهیم فریم ورک دیگری انتخاب کنیم گزینههای موجود یا Emberjs است یا Backbone یا Reactjs که آخری صرفا یک View Layer در مدل MVC محسوب میشود . Emberjs هم در ورژن 2 تغییرات زیادی دارد . وقتی همه این موارد را به شخصه کنار هم میگذارم گزینه ای غیر از Angular وجود ندارد شاید بعد از آمدن ورژن 2 انگولار و emberjs بتوان بهتر تصمیم گیری کرد .
در قسمت قبل نحوه انتقال اطلاعات از کامپونت پدر به فرزند را از طریق متادیتای Input@ برسی کردیم. در اینجا نکات تکمیلی را مورد بحث قرار خواهیم داد.
همانطور که قبلا مشاهده کردید، نام متغیر تعریف شده در کامپوننت فرزند (FormIsReadOnly) به عنوان یک خصوصیت در هنگام استفاده از کامپوننت ظاهر شده و عمل انقیاد از طریق این خصوصیت FormIsReadOnly صورت میگیرد. در صورتیکه قصد دارید نام خصوصیت ظاهر شده در کامپوننت، با نام متغیر تعریف شده در کامپوننت فرزند متفاوت باشد، به شکل زیر عمل کنید.
@Input('readOnly') FormIsReadOnly: boolean;
ردیابی تغییرات اعمال شده بر روی خصوصیت
در برخی موارد لازم است بعد از انتساب مقداری از سمت کامپوننت پدر به کامپوننت فرزند و قبل از استفاده کامپوننت فرزند از آن مقدار، تغییرات یا اعتبار سنجی بر روی مقدار منتسب شده اعمال کنیم. مثلا فرض کنید کامپوننتی را به نام LeftSideMenu تعریف کردهاید که باز بودن یا بسته بودن آن توسط کامپوننت پدر تنظیم میشود. در اینجا لازم است همواره منتظر تغییر این خصوصیت از سمت کامپوننت پدر بود تا بلافاصله بعد از تنظیم این خصوصیت، کامپوننت فرزند نسبت به باز شدن یا بسته ماندن، عکس العمل نشان داده و بلافاصله تغییرات را اعمال کند (منو را باز کند یا ببندد). لازمه این کار ردیابی تغییرات اعمال شده از سمت کامپوننت پدر میباشد تا به محض تغییر، اصلاحات یا اعتبار سنجیهای لازم بر روی آن اعمال شود. برای این کار دو راه حل وجود خواهد داشت.
- ردیابی تغییرات صورت گرفته از طریق تنظیم setter به متغیر تعریف شده با متادیتای Input@
- پیاده سازی onChanges توسط کامپوننت فرزند جهت ردیابی تغییرات کامپوننت
ردیابی تغییرات از طریق تنظیم setter
همانطور که گفته شد استفاده از کامپوننت فرزند به شکل زیر:
<app-customer-info FormIsReadOnly="true"></app-customer-info>
@Component({ selector: 'app-customer-info', templateUrl: './customer-info.component.html', styleUrls: ['./customer-info.component.css'] }) export class CustomerInfoComponent implements OnInit { private _formIsReadOnly: boolean; @Input() set FormIsReadOnly(value: boolean) { if (typeof (value) != 'boolean') throw new Error(`${value} type is not boolean.`); this._formIsReadOnly = value; } get FormIsReadOnly(): boolean { return this._formIsReadOnly; } constructor() { } ngOnInit() { } }
پیاده سازی onChanges توسط کامپوننت فرزند جهت ردیابی تغییرات کامپوننت
یکی دیگر از راههای تشخیص تغییرات اعمال شده بر روی کامپوننت، پیاده سازی اینترفیس onChanges توسط کامپوننت و پیاده سازی متد تعریف شده در این اینترفیس به نام ngOnChanges میباشد.
import { Component, OnInit, Input, OnChanges, SimpleChange } from '@angular/core'; import { ICustomerInfo } from '../../core/model/ICustomerInfo'; @Component({ selector: 'app-customer-info', template: '<ul>< li *ngFor="let change of changeLog">{{change }}</li></ul>', styleUrls: ['./customer-info.component.css'] }) export class CustomerInfoComponent implements OnChanges { changeLog: string[] = []; @Input() FormIsReadOnly: boolean; ngOnChanges(changes: { [propKey: string]: SimpleChange }) { let log: string[] = []; for (let propName in changes) { let changedProp = changes[propName]; let to = JSON.stringify(changedProp.currentValue); if (changedProp.isFirstChange()) { log.push(`Initial value of ${propName} set to ${to}`); } else { let from = JSON.stringify(changedProp.previousValue); log.push(`${propName} changed from ${from} to ${to}`); } } this.changeLog.push(log.join(', ')); } constructor() { } }
• Initial value of FormIsReadOnly set to true • FormIsReadOnly changed from true to "trued" • FormIsReadOnly changed from "trued" to "true" • FormIsReadOnly changed from "true" to "truef" • FormIsReadOnly changed from "truef" to "true" • FormIsReadOnly changed from "true" to "tru" • FormIsReadOnly changed from "tru" to "tr" • FormIsReadOnly changed from "tr" to "t" • FormIsReadOnly changed from "t" to "" • FormIsReadOnly changed from "" to "t" • FormIsReadOnly changed from "t" to "tr" • FormIsReadOnly changed from "tr" to "tru" • FormIsReadOnly changed from "tru" to "true"
در ادامه عنوان «بهجریان انداختن رخدادها از کامپوننت فرزند و گرفتن آنها را از طریق کامپوننت پدر» را مورد برسی قرار خواهیم داد.
ادامه دارد/