When you’re dealing with complex and structured data, you need to determine whether the data is valid or not. JSON-Schema is the standard of JSON documents that describes the structure and the requirements of your JSON data. In this two-part series, you’ll learn how to use JSON-Schema to validate data.
اشتراکها
بعد از نصب و معرفی آن در appmodule برنامه ، پیغام زیر درCommand Prompt نمایش میدهد. آیا این پکیج همخوانی با Angular 5 ندارد؟
ERROR in ./node_modules/angular2-permission/index.ts Module build failed: Error: C:\Front\node_modules\angular2-permission\index.ts is missing from the TypeScript compilation. Please make sure it is in your tsconfig via the 'files' or 'include' property. The missing file seems to be part of a third party library. TS files in published libraries are often a sign of a badly packaged library. Please open an issue in the library repository to alert its author and ask them to package the library using the Angular Package Format (https://goo.gl/jB3GVv). at AngularCompilerPlugin.getCompiledFile (C:\Front\node_modules\@ngtools\webpack\src\angular_compiler_plugin.js:674:23) at plugin.done.then (C:\Front\node_modules\@ngtools\webpack\src\loader.js:467:39) at process._tickCallback (internal/process/next_tick.js:68:7)
اشتراکها
برنامه نویسی چند هسته ای در .NET
مطالب
CoffeeScript #4
Syntax
Loops
for name in ["Vahid", "Hamid", "Saeid"] alert "Hi #{name}"
var i, len, name, ref; ref = ["Vahid", "Hamid", "Saeid"]; for (i = 0, len = ref.length; i < len; i++) { name = ref[i]; alert("Hi " + name); }
for name, i in ["Vahid", "Hamid", "Saeid"] alert "#{i} - Hi #{name}"
alert name for name in ["Vahid", "Hamid", "Saeid"]
names = ["Vahid", "Hamid", "Saeid"] alert name for name in names when name[0] is "V"
var i, len, name, names; names = ["Vahid", "Hamid", "Saeid"]; for (i = 0, len = names.length; i < len; i++) { name = names[i]; if (name[0] === "V") { alert(name); } }
names = "Vahid": "Mohammad Taheri", "Ali": "Ahmadi" alert("#{first} #{last}") for first, last of names
var first, last, names; names = { "Vahid": "Mohammad Taheri", "Ali": "Ahmadi" }; for (first in names) { last = names[first]; alert(first + " " + last); }
num = 6 minstrel = while num -= 1 num + " Hi"
var minstrel, num; num = 6; minstrel = (function() { var _results; _results = []; while (num -= 1) { _results.push(num + " Hi"); } return _results; })();
Arrays
CoffeeScript با الهام گرفتن از Ruby، به وسیله تعیین محدوده، آرایه را ایجاد میکند. محدوده آرایه به وسیله دو عدد تعیین میشوند که با .. یا ... از هم جدا میشوند.range = [1..5]
var range; range = [1, 2, 3, 4, 5];
firstTwo = ["one", "two", "three"][0..1]
var firstTwo; firstTwo = ["one", "two", "three"].slice(0, 2);
numbers = [0..9] numbers[3..5] = [-3, -4, -5]
my = "my string"[0..2]
words = ["Vahid", "Hamid", "Saeid", "Ali"] alert "Stop" if "Hamid" in words
- در صورت تعریف محدوده آرایه به صورت [..3]numbers (که آرایه numbers از قبل تعریف شده باشد)، خروجی، آرایهای از مقادیر موجود در numbers را از خانه شماره 4 تا انتهای آن برمی گرداند.
- در صورت تعریف محدوده آرایه به صورت [..3-]numbers (که آرایه numbers از قبل تعریف شده باشد)، خروجی، آرایهای از مقادیر موجود در numbers را از خانه انتهایی به میزان 3 خانه به سمت ابتدای آرایه برمیگرداند.
- در صورت عدم تعریف محدوده آرایه و فقط استفاده از [..] یا [...] (یک شکل عمل میکنند)، کل مقادیر آرایه اصلی (که از قبل تعریف شده باشد)، برگردانده میشود.
- تفاوت .. و ... در حالتی که دو عدد برای محدوده تعریف شود، در این است که ... آرایه به صورت عدد انتهایی - 1 تعریف میشود. مثلا [3...0] یعنی خانههای آرایه از 0 تا 2 را به عنوان خروجی برگردان.
Aliases
CoffeeScript شامل یک سری نامهای مستعار است که برای خلاصه نویسی بیشتر بسیار مفید هستند. یکی از آن نام ها، @ است که به جای نوشتن this به کار میرود.@name = "Vahid"
this.name = "Vahid";
User::first = -> @records[0]
User.prototype.first = function() { return this.records[0]; };
alert "OK" if name?
if (typeof name !== "undefined" && name !== null) { alert("OK"); }
name = myName ? "-"
var name; name = typeof myName !== "undefined" && myName !== null ? myName : "-";
user.getAddress()?.getStreetName()
var ref; if ((ref = user.getAddress()) != null) { ref.getStreetName(); }
user.getAddress().getStreetName?()
var base; if (typeof (base = user.getAddress()).getStreetName === "function") { base.getStreetName(); }
اشتراکها
کانورتور عمومی برای مقادیر در WPF
In this tutorial I want to demonstrate how we can build a custom
vertical content section using jQuery. All of the internal content is
held inside div containers which can be navigated with an icon-based
menu. This content isn’t loaded externally via Ajax, but is instead
hidden & displayed using content sections already on the page. Demo
اشتراکها
OpenIddict 4.0 منتشر شد
اشتراکها
کش درون حافظه ای در Asp.net core
بازخوردهای پروژهها
Fill and FillByObject
متود زیر برای تولید عبارت مبتنی بر الگو زمانی که الگو پیچیدهتر از این است که بشود با string.Format به راحتی پیاده سازی شود ولی چندان هم پیچیده نیست که ابزارهای حرفه ایتری مانند T4 یا Razor به کار بیایند، میتواند مورد استفاده قرار گیرد:
/// <summary> /// Insert values from an object into a string pattern. To specify the object's property you have to use the '{propertyName}'. /// </summary> /// <remarks> /// This method is a replacement to String.Format, but it has two differences: /// <list type="simple"> /// <item>It reverese the order you call the functionality, instead of writing String.Format(pattern, args) you write pattern.FillByObject(args). This makes the code look cleaner.</item> /// <item>You supply the pattern with an object and specify insertion points by property names.</item> /// </list> /// <example> /// <![CDATA[ /// "First name:{firstName}, Sur name:{Surname}".FillByObject(new {firstName = "Sam", lastName="Naseri"}); /// ]]> /// </example> /// </remarks> /// <seealso cref="Fill"/> /// <typeparam name="T">Type of bindingValue.</typeparam> /// <param name="bindingPattern">The pattern to fill.</param> /// <param name="bindingValue">The object providing values to fill in the pattern.</param> /// <returns>The pattern filled with values.</returns> public static string FillByObject<T>(this string bindingPattern, T bindingValue) { var properties = GetProperties(typeof(T)).ToList(); var values = properties.Select(property => property.GetValue(bindingValue, new object[] { })).ToList(); var result = bindingPattern; for (int index = 0; index < properties.Count; index++) { var property = properties[index]; var propPattern = "{" + property.Name + "}"; var old = result; result = result.Replace(propPattern, values[index] != null ? values[index].ToString() : ""); } return result; }
پیاده سازی فوق یک پیاده سازی بسیار خام و بسیار کند است و جای بهبود زیادی دارد. من فقط برای سناریوهای ساده که کارایی مطرح نیست استفاده از متود فوق را توصیه میکنم.
متودهای جانبی مورد نیاز:
private static IEnumerable<PropertyInfo> GetProperties(Type t) { return t.GetProperties(BindingFlags.Public | BindingFlags.Instance); }
همچنین متود زیر هم میتواند نوشتن string.Format را یک خرده سادهتر کند:
/// <summary> /// A simple replacement for String.Format which only makes the codes look nicer. /// </summary> /// <param name="pattern">The source string that you want to replace insertion points on it.</param> /// <param name="args">Values to be replaced in the pattern.</param> /// <returns></returns> public static string Fill(this string pattern, params object[] args) { return string.Format(pattern, args); }