|
@@ -6,13 +6,13 @@
|
|
|

|
|
|
[](https://alpinejs.codewithhugo.com/chat/)
|
|
|
|
|
|
-توفر لك Alpine.js بنية تفاعلية (تصريحية) مثل أُطر العمل الشهيرة كـ Vue و React بكُلفة وجهد أقل بكثير.
|
|
|
+توفر لك Alpine.js بنية تفاعلية (تصريحية) مثل أُطر العمل الشهيرة Vue و React بكُلفة وجهد أقل بكثير.
|
|
|
|
|
|
يمكنك الإحتفاظ بـ DOM والاستمرار في استخدامه، وإضافة الدّوال والوظائف له عند الحاجة.
|
|
|
|
|
|
يشبه إلى حد ما [Tailwind](https://tailwindcss.com/) ولكن في الجافاسكربت.
|
|
|
|
|
|
-> ملاحظة: نشير إلى أن بُنية Alpine.js شبية جداً إلى [Vue](https://vuejs.org/) (أو [Angular](https://angularjs.org/)). أنا ممتن لهذه الأُطر بما قدموه في تطوير الويب.
|
|
|
+> ملاحظة: نشير إلى أن بُنية Alpine.js شبية جداً بـ [Vue](https://vuejs.org/) (أو [Angular](https://angularjs.org/)). أنا ممتن لهذه الأُطر بما قدموه في تطوير الويب.
|
|
|
|
|
|
#### ملاحظة:
|
|
|
|
|
@@ -48,7 +48,7 @@
|
|
|
|
|
|
سيقوم Alpine.js بتهيئة نفسه، سهلة أليس كذلك!
|
|
|
|
|
|
-في بيئات التطوير، نوصي باستعمال إصدار محدّد كما في الرابط، لتجنب حدوث مشاكل غير متوقعة أو تصادمها مع الإصدارات الحديثة. على سبيل المثال، لإستخدام الإصدار الأخير (2.8.0) يمكنك كتابة:
|
|
|
+في بيئات التطوير، نوصي باستعمال إصدار محدّد كما في الرابط، لتجنب حدوث مشاكل غير متوقعة أو تصادمها مع الإصدارات الحديثة. على سبيل المثال، لاستخدام الإصدار الأخير (2.8.0) يمكنك كتابة:
|
|
|
|
|
|
<div dir="ltr">
|
|
|
|
|
@@ -92,7 +92,7 @@ import 'alpinejs'
|
|
|
|
|
|
</div>
|
|
|
|
|
|
-لو تُلاحظ في السطور أعلاه كتبنا [module/nomodule pattern](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/) ، تسمح هذه الأنماط للمتصفحات الحديث تحميل مجموعة الوحدات بشكل تلقائي، بينما ستقوم IE11 والمتصفحات القديمة الأخرى تحميل وحدات IE11 تلقائياً.
|
|
|
+لو تُلاحظ في السطور أعلاه كتبنا [module/nomodule pattern](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/) ، تسمح هذه الأنماط للمتصفحات الحديثة بتحميل مجموعة الوحدات بشكل تلقائي، بينما ستقوم IE11 والمتصفحات القديمة الأخرى تبحميل وحدات IE11 تلقائياً.
|
|
|
|
|
|
## طريقة الاستخدام
|
|
|
|
|
@@ -170,13 +170,13 @@ import 'alpinejs'
|
|
|
| [`x-show`](#x-show) | إظهار أو إزالة العناصر بناء على التعبيرات المنطقية <span dir="ltr">`display: none;`</span> صحيحة أو خاطئة. |
|
|
|
| [`x-bind`](#x-bind) | يضبط قيمة السّمة (attribute) على حسب نتائج تعليمات الجافاسكربت. |
|
|
|
| [`x-on`](#x-on) | يربط المُنصِت للأحداث (event listener) بالعنصر، يتم تنفيذ تعليمات الجافاسكربت عند التفاعل معه. |
|
|
|
-| [`x-model`](#x-model) | يضيف اتصال للبيانات ثنائي الإتجاه "two-way data binding" حيث أن القيم الذي يُدخلها المستخدم تتم مزامنتها مع قيمة بيانات العنصر للمكوّن. |
|
|
|
+| [`x-model`](#x-model) | يضيف اتصالا للبيانات ثنائي الإتجاه "two-way data binding" حيث أن القيم الذي يُدخلها المستخدم تتم مزامنتها مع قيمة بيانات العنصر للمكوّن. |
|
|
|
| [`x-text`](#x-text) | يعمل بشكل مشابه لـ `x-bind`، ولكنه يقوم بتحديث النص المضمن `innerText` داخل العنصر. |
|
|
|
| [`x-html`](#x-html) | يعمل بشكل مشابه لـ `x-bind`، ولكنه يقوم بتحديث النص المضمن `innerText` داخل العنصر. |
|
|
|
-| [`x-ref`](#x-ref) | طريقة بسيطة لإسترجاع عنصر داخل DOM موجود خارج المكوّن الخاص بك. |
|
|
|
-| [`x-if`](#x-if) | إزالة عنصر تماماً من DOM. يجب استخدامه داخل وَسم `<template>` |
|
|
|
+| [`x-ref`](#x-ref) | طريقة سهلة لاسترجاع عنصر داخل DOM موجود خارج المكوّن الخاص بك. |
|
|
|
+| [`x-if`](#x-if) | إزالة عنصر تماماً من الـDOM. يجب استخدامه داخل وَسم `<template>` |
|
|
|
| [`x-for`](#x-for) | ينشئ فروع DOM جديدة لكل عنصر من عناصر المصفوفة. يجب استخدامه داخل وَسم `<template>` |
|
|
|
-| [`x-transition`](#x-transition) | توجيه لعمل تأثيرات إنتقالية في مراحل مختلفة على الأصناف (Classes) |
|
|
|
+| [`x-transition`](#x-transition) | توجيه لعمل تأثيرات انتقالية في مراحل مختلفة على الأصناف (Classes) |
|
|
|
| [`x-spread`](#x-spread) | يسمح لك بربط الكائنات التي تحتوي على توجيهات Alpine بالعناصر، لتحسين إمكانية إعادة استخدامه بشكل أفضل. |
|
|
|
| [`x-cloak`](#x-cloak) | تتم إزالة هذه السمة عند تهيئة Alpine. مفيد لإخفاء DOM المُهيأ مسبقًا. |
|
|
|
|
|
@@ -186,12 +186,11 @@ import 'alpinejs'
|
|
|
| --: | --: |
|
|
|
| <span dir="ltr">[`$el`](#el)</span> | ترجع فرع DOM الخاص بالمكوّن الأساسي (root component). |
|
|
|
| <span dir="ltr">[`$refs`](#refs)</span> | يسترجع عناصر DOM المميّزة بـ `x-ref` داخل المكوّن. |
|
|
|
-| <span dir="ltr">[`$event`](#event)</span> | يرجع كائن الحدث "Event" الأصلي داخل المُتنصت لأحداث المستخدم. |
|
|
|
-| <span dir="ltr">[`$dispatch`](#dispatch)</span> | ينشئ حدثاً مخصصا `CustomEvent` ويرسله داخلياً باستخدام <span dir="ltr">`.dispatchEvent()`</span>. |
|
|
|
+| <span dir="ltr">[`$event`](#event)</span> | يرجع كائن الحدث "Event" الأصلي داخل المُنصت لأحداث المستخدم. |
|
|
|
+| <span dir="ltr">[`$dispatch`](#dispatch)</span> | ينشئ حدثاً مخصصا `CustomEvent` ويرسله داخلياً باستخدام `.dispatchEvent()`. |
|
|
|
| <span dir="ltr">[`$nextTick`](#nexttick)</span> | بعد معالجة Alpine لتحديث DOM يتم تنفيذ تعليمات برمجية. |
|
|
|
| <span dir="ltr">[`$watch`](#watch)</span> | يقوم باستدعاء callback تم تحديده مسبقاً عندما يتم تعديل خاصية المُراقب "watched" |
|
|
|
|
|
|
-
|
|
|
## الرعاة
|
|
|
|
|
|
<img width="33%" src="https://refactoringui.nyc3.cdn.digitaloceanspaces.com/tailwind-logo.svg" alt="Tailwind CSS">
|
|
@@ -216,9 +215,9 @@ import 'alpinejs'
|
|
|
|
|
|
**البُنية:** <span dir="ltr">`<div x-data="[object literal]">...</div>`</span>
|
|
|
|
|
|
-تعرّف `x-data` حقل/نطاق جديد للمكوّن، يخبر Alpine بتهيئة المكوّن الجديد بكائن البيانات المعرّف والمحدّد مسبقاً.
|
|
|
+تعرّف `x-data` حقل/نطاق جديد للمكوّن، يخبر Alpine بتهيئة المكوّن الجديد بكائن البيانات المعرّف والمحدّد مسبقاً.
|
|
|
|
|
|
-مشابه لخاصية `data` بالمكونّات في إطار Vue.
|
|
|
+مشابه لخاصية `data` في المكونّات في إطار Vue.
|
|
|
|
|
|
**استخراج التعابير المنطقية للمكوّن**
|
|
|
|
|
@@ -247,11 +246,7 @@ import 'alpinejs'
|
|
|
</script>
|
|
|
```
|
|
|
|
|
|
-</div>
|
|
|
-
|
|
|
-
|
|
|
-> لمستخدمي مجمّع الوحدات (bundler): يرجى ملاحظة أن الدوال التي يصل إليها Alpine.js في النطاق العام (window). فلاستخدام x-data يجب أن تصرّحها إلى `window`. على سبيل المثال <span dir="ltr">`window.dropdown = function () {}`</span> (لأنه في Webpack ،Rollup ،Parcel وما إلى ذلك، الدّوال التي تكتبتها تكون بشكل إفتراضي ضِمن نطاق الوحدة "module" وليس في نطاق الصفحة `window`).
|
|
|
-
|
|
|
+> لمستخدمي مجمّع الوحدات (bundler): يرجى ملاحظة أن الدوال التي يصل إليها Alpine.js في النطاق العام (window). فلاستخدام x-data يجب أن تصرّحها إلى `window`. على سبيل المثال <span dir="ltr">`window.dropdown = function () {}`</span> (لأنه في Webpack ،Rollup ،Parcel وما إلى ذلك، الدّوال التي تكتبتها تكون بشكل افتراضي ضِمن نطاق الوحدة "module" وليس في نطاق الصفحة `window`).
|
|
|
|
|
|
يمكنك أيضاً دمج عدة كائنات متعددة معاً باستخدام محلّل الكائنات (object destructuring).
|
|
|
|
|
@@ -273,7 +268,7 @@ import 'alpinejs'
|
|
|
|
|
|
ينفّذ `x-init` تعليمات برمجية عند تشغيل وتهيئة إحدى المكوّنات.
|
|
|
|
|
|
-إذا أردت تنفيذ التعليمات البرمجية بعد أن يجري Alpine تحديثه على DOM (مُماثل لـ <span dir="ltr">`mounted()`</span> في Vue.js) يمكنك إرجاع callback من `x-init` وسيتم تشغيله بعدها:
|
|
|
+إذا أردت تنفيذ التعليمات البرمجية بعد أن يجري Alpine تحديثه على الـDOM (مُماثل لـ <span dir="ltr">`mounted()`</span> في Vue.js) يمكنك إرجاع callback من `x-init` وسيتم تشغيله بعدها:
|
|
|
|
|
|
<span dir="ltr"> `x-init="() => { // يمكننا الوصول إلى DOM بعد تهيئته // }"` </span>
|
|
|
|
|
@@ -294,7 +289,7 @@ import 'alpinejs'
|
|
|
|
|
|
```html
|
|
|
<div x-show.transition="open">
|
|
|
- يتم عمل تأثير بصري بالظهور "in" و الإختفاء "out"
|
|
|
+ يتم عمل تأثير بصري بالظهور "in" و الاختفاء "out"
|
|
|
</div>
|
|
|
```
|
|
|
|
|
@@ -314,7 +309,7 @@ import 'alpinejs'
|
|
|
| `x-show.transition.in.duration.200ms.out.duration.50ms` | تأثيرات على فترات مختلفة "in" و "out". |
|
|
|
|
|
|
|
|
|
-> ملاحظة: يمكنك دمج جميع التاثيرات مع بعضها البعض (على الرغم من أنها غريبة ربما): `x-show.transition.in.duration.100ms.origin.top.right.opacity.scale.85.out.duration.200ms.origin.bottom.left.opacity.scale.95`
|
|
|
+> ملاحظة: يمكنك دمج جميع التأثيرات مع بعضها البعض (على الرغم من أنها غريبة ربما): `x-show.transition.in.duration.100ms.origin.top.right.opacity.scale.85.out.duration.200ms.origin.bottom.left.opacity.scale.95`
|
|
|
|
|
|
> ملاحظة: سينتظر `x-show` إلى حين أن تنتهني جميع التأثيرات، إذا كنت تريد تجاهلها، أضف المعدّل <span dir="ltr">`.immediate`</span>
|
|
|
|
|
@@ -332,13 +327,13 @@ import 'alpinejs'
|
|
|
|
|
|
### `x-bind`
|
|
|
|
|
|
-> ملاحظة: يمكنك اختصار الكتابة باستعمال النقطتين ":" كـ <span dir="ltr">`:type="..."`</span>
|
|
|
+> ملاحظة: يمكنك اختصار الكتابة باستعمال النقطتين ":" مثل <span dir="ltr">`:type="..."`</span>
|
|
|
|
|
|
**المثال:** <span dir="ltr">`<input x-bind:type="inputType">`</span>
|
|
|
|
|
|
**البُنية:** <span dir="ltr">`<input x-bind:[attribute]="[expression]">`</span>
|
|
|
|
|
|
-يضبط قيمة السّمة (attribute) على حسب نتائج تعليمات الجافاسكربت. ويمكن لهذه التعليمات أن تصل الى جميع بيانات المكوّن. ويتم تحديثه في كل مرة يتم فيها تحديث بياناته.
|
|
|
+يضبط قيمة السّمة (attribute) على حسب نتائج تعليمات الجافاسكربت. ويمكن لهذه التعليمات أن تصل إلى جميع بيانات المكوّن. ويتم تحديثه في كل مرة يتم فيها تحديث بياناته.
|
|
|
|
|
|
> ملاحظة: يتم تحديث ارتباطات السمات (binding) فقط إذا تم تحديث قيّمها. يكتشف Alpine تلقائيًا هذه القيم والتحديثات ثم يحسّنها.
|
|
|
|
|
@@ -346,9 +341,9 @@ import 'alpinejs'
|
|
|
|
|
|
يتصرف `x-bind` بشكل مختلف قليلاً عند تحديد الصنف (class attribute).
|
|
|
|
|
|
-بالنسبة للأصناف (classes) قم بتمرير كائن يكون مفتاحه هو إسم الفئة، وقيم هذه الأزواج عبارة عن تعبيرات منطقية تحدّد ما إذا كان يتم تطبيق الصنف على العنصر أم لا.
|
|
|
+بالنسبة للأصناف (classes) قم بتمرير كائن يكون مفتاحه هو اسم الفئة، وقيَمُ هذه الأزواج عبارة عن تعبيرات منطقية تحدّد ما إذا كان يتم تطبيق الصنف على العنصر أم لا.
|
|
|
|
|
|
-كمثال:
|
|
|
+مثال:
|
|
|
<span dir="ltr">`<div x-bind:class="{ 'hidden': foo }"></div>`</span>
|
|
|
|
|
|
في هذا المثال يتم تطبيق الصنف "hidden" فقط عندما تكون قيمة foo صحيحة `true`.
|
|
@@ -357,37 +352,34 @@ import 'alpinejs'
|
|
|
|
|
|
يدعم `x-bind` المتغيرات بالإضافة إلى تعبيرات الجافاسكربت في حالة إذا كانت تُرجع قيمة منطقية صحيحة أو خاطئة (`true` أو `false`).
|
|
|
|
|
|
-كمثال:
|
|
|
-
|
|
|
+مثال:
|
|
|
<div dir="ltr">
|
|
|
-
|
|
|
```html
|
|
|
<!-- العبارة: -->
|
|
|
<button x-bind:disabled="myVar">إضغطني</button>
|
|
|
|
|
|
<!-- إذا myVar == true: -->
|
|
|
-<button disabled="disabled">إضغطني</button>
|
|
|
+<button disabled="disabled">اضغطني</button>
|
|
|
|
|
|
<!-- في حال myVar == false: -->
|
|
|
-<button>Click me</button>
|
|
|
+<button>اضغطني</button>
|
|
|
```
|
|
|
-
|
|
|
</div>
|
|
|
|
|
|
هنا تتم إضافة السمة `disabled` أو إزالتها بناءً على قيمة المتغيّر `myVar`.
|
|
|
|
|
|
-تدعم كذلك Alpine سمات منطقية مختلفة HTML specification كـ: `disabled`,`readonly`,`required`,`checked`,`hidden`,`selected`,`open` وغيرها.
|
|
|
+تدعم كذلك Alpine سمات منطقية مختلفة HTML specification مثل: `disabled`,`readonly`,`required`,`checked`,`hidden`,`selected`,`open` وغيرها.
|
|
|
|
|
|
المُعدّل .camel
|
|
|
مثال: <svg x-bind:view-box.camel="viewBox">
|
|
|
|
|
|
-يقوم المعدّل بضبط وربط حالة الأحرف بصيغة camel case لإسم السمة. في المثال أعلاه، تم ربط قيمة viewBox بِسِمة viewBox (بدلاً من view-box).
|
|
|
+يقوم المعدّل بضبط وربط حالة الأحرف بصيغة camel case لاسم السمة. في المثال أعلاه، تم ربط قيمة viewBox بِسِمة viewBox (بدلاً من view-box).
|
|
|
|
|
|
---
|
|
|
|
|
|
### `x-on`
|
|
|
|
|
|
-> ملاحظة: يمكنك اختصار الكتابة باستعمال النقطتين ":" كـ <span dir="ltr">`@click="..."`</span>
|
|
|
+> ملاحظة: يمكنك اختصار الكتابة باستعمال النقطتين ":" مثل <span dir="ltr">`@click="..."`</span>
|
|
|
|
|
|
**المثال:** <span dir="ltr">`<button x-on:click="foo = 'bar'"></button>`</span>
|
|
|
|
|
@@ -397,7 +389,7 @@ import 'alpinejs'
|
|
|
|
|
|
يتم تحديث السِمات الأخرى للعنصر المرتبطة بمصدر البيانات هذا بمجرد تعديل البيانات الموجودة في التعليمات البرمجية.
|
|
|
|
|
|
-> ملاحظة: اختياريًا، يمكن أيضًا تحديد اسم دالة JavaScript.
|
|
|
+> ملاحظة: اختياريًا، يمكن أيضًا تحديد اسم دالة الجافاسكربت.
|
|
|
|
|
|
**المثال:** <span dir="ltr">`<button x-on:click="myFunction"></button>`</span>
|
|
|
|
|
@@ -407,11 +399,11 @@ import 'alpinejs'
|
|
|
|
|
|
**المثال:** <span dir="ltr">`<input type="text" x-on:keydown.escape="open = false">`</span>
|
|
|
|
|
|
-يمكنك الإستجابة لأحداث معينة ينقر عليها المستخدم في لوحة المفاتيح باستخدام المعدّلات `x-on:keydown`. يرجى ملاحظة أن هذا المُعدّل يستخدم صيغة kebab-case لتسمية قيم `Event.key`.
|
|
|
+يمكنك الإستجابة لأحداث معينة عند ضغط المستخدم في لوحة المفاتيح باستخدام المعدّلات `x-on:keydown`. يرجى ملاحظة أن هذا المُعدّل يستخدم صيغة kebab-case لتسمية قيم `Event.key`.
|
|
|
|
|
|
أمثلة: `enter`, `escape`, `arrow-up`, `arrow-down`
|
|
|
|
|
|
-> يمكننا كذلك الإستجابة أزرار لوحة المفاتيح الأساسية كـ <span dir="ltr">`x-on:keydown.cmd.enter="foo"`</span>
|
|
|
+> يمكننا كذلك الإستجابة لأزرار لوحة المفاتيح الأساسية مثل <span dir="ltr">`x-on:keydown.cmd.enter="foo"`</span>
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.away`</span>**
|
|
|
|
|
@@ -419,39 +411,39 @@ import 'alpinejs'
|
|
|
|
|
|
لا يتم تنفيذ تعبير Event Handler إلا إذا لم يتم تشغيل الحدث بواسطة العنصر نفسه (أو مكوناته الفرعية).
|
|
|
|
|
|
-هذا مفيد لإخفاء القوائم المنسدلة والنوافذ عندما ينقر المستخدم في مكان آخر.
|
|
|
+هذا مفيد لإخفاء القوائم المنسدلة والنوافذ عندما يضغط المستخدم في مكان آخر.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.prevent`</span>**
|
|
|
**المثال:** <span dir="ltr">`<input type="checkbox" x-on:click.prevent>`</span>
|
|
|
|
|
|
-تؤدي إضافة <span dir="ltr">`.prevent`</spam> إلى مستمع الحدث إلى استدعاء منع `preventDefault` في الحدث الذي سيتم تنفيذه. في المثال أعلاه، هذا يعني أن مربع الاختيار لن يتم تحديده بالفعل عندما ينقر المستخدم عليه.
|
|
|
+تؤدي إضافة <span dir="ltr">`.prevent`</span> داخل مستمع الحدث إلى استدعاء منع `preventDefault` في الحدث الذي سيتم تنفيذه. في المثال أعلاه، هذا يعني أن مربع الاختيار لن يتم تحديده بالفعل عندما ينقر المستخدم عليه.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.stop`</span>**
|
|
|
**المثال::** <span dir="ltr">`<div x-on:click="foo = 'bar'"><button x-on:click.stop></button></div>`</span>
|
|
|
|
|
|
-إضافة <span dir="ltr">`.stop`</span> إلى المتصنّت للأحداث يستدعي `stopPropagation.` في المثال أعلاه، يعني أن الحدث "click" لن ينتقل إلى `<div>` الخارجي. بمعنى آخر، عندما ينقر المستخدم على الزر، لا يتم تعريف `foo` على أنه `bar`.
|
|
|
+إضافة <span dir="ltr">`.stop`</span> إلى المنصت للأحداث يستدعي `stopPropagation.` في المثال أعلاه، يعني أن الحدث "click" لن ينتقل إلى `<div>` الخارجي. بمعنى آخر، عندما ينقر المستخدم على الزر، لا يتم تعريف `foo` على أنه `bar`.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.self`</span>**
|
|
|
**المثال:** <span dir="ltr">`<div x-on:click.self="foo = 'bar'"><button></button></div>`</span>
|
|
|
|
|
|
-إضافة .self إلى المتصنّت للأحداث إلى تشغيل الحدث فقط إذا كان <span dir="ltr">`$event.target`</span> و نفسه العنصر. في المثال أعلاه، يعني أنه عند النقر على الزر "button" لن يتم تشغيل الحدث
|
|
|
+إضافة .self إلى المنصت للأحداث يأدي إلى تشغيل الحدث فقط إذا كان <span dir="ltr">`$event.target`</span> هو نفس العنصر. في المثال أعلاه، يعني أنه عند النقر على الزر "button" لن يتم تشغيل الحدث.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.window`</span>**
|
|
|
**المثال:** <span dir="ltr">`<div x-on:resize.window="isOpen = window.outerWidth > 768 ? false : open"></div>`</span>
|
|
|
|
|
|
-إضافة <span dir="ltr">`.window`</span> إلى مستمع الأحداث، سيقوم بتثبيت المتصنّت للأحداث على نافذة المتصفّح كله `window` بدلاً من DOM الذي قمت بتصريحه أو تحديده. هذا مفيد لك في حال أردت ضبط أحد المكوّنات وتغييرها على حسب حجم (أبعاد) المتصفّح. في المثال أعلاه سيتم إغلاق النافذة أو القائمة المنسدلة إذا تجاوزت أبعاد المتصفح 768 بكسل، خلاف ذلك نُبقيه على حالته.
|
|
|
+إضافة <span dir="ltr">`.window`</span> إلى منصت الأحداث، سيقوم بتثبيت منصت للأحداث على نافذة المتصفّح كله `window` بدلاً من DOM الذي قمت بتصريحه أو تحديده. هذا مفيد لك في حال أردت ضبط أحد المكوّنات وتغييرها على حسب حجم (أبعاد) المتصفّح. في المثال أعلاه سيتم إغلاق النافذة أو القائمة المنسدلة إذا تجاوزت أبعاد المتصفح 768 بكسل، خلاف ذلك نُبقيه على حالته.
|
|
|
|
|
|
->ملاحظة: يمكنك أيضًا استخدام معدّل <span dir="ltr">`.document`</span> لإرفاق المتصنّت بدلا من `window`.
|
|
|
+>ملاحظة: يمكنك أيضًا استخدام معدّل `.document` لإرفاق المنصت بدلا من `window`.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.once`</span>**
|
|
|
**المثال:** <span dir="ltr">`<button x-on:mouseenter.once="fetchSomething()"></button>`</span>
|
|
|
|
|
|
-تعني إضافة المعدّل <span dir="ltr">`.once`</span> إلى المتصنّت للحدث أن المنصت (listener) يعمل مرة واحدة فقط. هذا مفيد للمهام التي تريد القيام بها مرة واحدة فقط، مثل الجلب الجزئي لشفرات HTML أو ما شابه.
|
|
|
+تعني إضافة المعدّل <span dir="ltr">`.once`</span> إلى المنصت للحدث أن المنصت (listener) يعمل مرة واحدة فقط. هذا مفيد للمهام التي تريد القيام بها مرة واحدة فقط، مثل الجلب الجزئي لشفرات HTML أو ما شابه.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.passive`</span>**
|
|
|
**المثال:** <span dir="ltr">`<button x-on:mousedown.passive="interactive = true"></button>`</span>
|
|
|
|
|
|
-إذا أضفنا <span dir="ltr">`.passive`</span> إلى المتصنّت للحدث، فإن هذا الرمز المميز سيعطل وظيفة <span dir="ltr">`preventDefault()`</span> ولن تعمل على أي حدث يتم تنفيذه. يمكن أن يساعدك أحياناً في تحسين أداء التمرير (scroll) على الأجهزة التي تعمل باللمس.
|
|
|
+إذا أضفنا <span dir="ltr">`.passive`</span> إلى المنصت للحدث، فإن هذا الرمز المميز سيعطل وظيفة `preventDefault()` ولن تعمل على أي حدث يتم تنفيذه. يمكن أن يساعدك أحياناً في تحسين أداء التمرير (scroll) على الأجهزة التي تعمل باللمس.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.debounce`</span>**
|
|
|
**المثال:** <span dir="ltr">`<input x-on:input.debounce="fetchSomething()">`</span>
|
|
@@ -475,7 +467,7 @@ import 'alpinejs'
|
|
|
**المُعدّل <span dir="ltr">`.camel`</span>**
|
|
|
**المثال:** <span dir="ltr">`<input x-on:event-name.camel="doSomething()">`</span>
|
|
|
|
|
|
-يقوم المتصنّت للأحداث بالإنصات إلى الأحداث التي تحمل حالة أحرف بصيغة camelCase. في هذا المثال سيتم تنفيذها للعناصر التي تحمل اسم `eventName`.
|
|
|
+يقوم المنصت للأحداث بالإنصات إلى الأحداث التي تحمل حالة أحرف بصيغة camelCase. في هذا المثال سيتم تنفيذها للعناصر التي تحمل اسم `eventName`.
|
|
|
|
|
|
---
|
|
|
|
|
@@ -484,15 +476,15 @@ import 'alpinejs'
|
|
|
|
|
|
**البُنية:** <span dir="ltr">`<input type="text" x-model="[data item]">`</span>
|
|
|
|
|
|
-يضيف `x-model` ربط بيانات ثنائي الإتجاه "two-way data binding" (أي أن ربط البيانات يكون في كلا الطرفين). بمعنى آخر، أن قيمة العنصر تتم مزامنتها مع قيمة بيانات عنصر للمكوّن.
|
|
|
+يضيف `x-model` ربط بيانات ثنائي الإتجاه "two-way data binding" (أي أن ربط البيانات يكون في كلا الطرفين). بمعنى آخر، أن قيمة العنصر تتم مزامنتها مع قيمة بيانات عنصر المكوّن.
|
|
|
|
|
|
> يكتشف `x-model` تلقائياً التغييرات التي تطرأ على العناصر التالية: text inputs ،checkboxes ،radio buttons ،textareas ،selects ،multiple selects.
|
|
|
-> يمكنك فهم كيف يعمل ذلك في الخفاء في "سيناريوهات" إطار عمل [how Vue would](https://vuejs.org/v2/guide/forms.html).
|
|
|
+> يمكنك فهم كيف يعمل ذلك في الخفاء في "سيناريوهات" إطار عمل [Vue](https://vuejs.org/v2/guide/forms.html).
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.number`</span>**
|
|
|
**المثال:** <span dir="ltr">`<input x-model.number="age">`</span>
|
|
|
|
|
|
-يقوم <span dir="ltr">`.number`</span> بتحويل القيمة المدخلة عبر `<input>` إلى رقم. في حال تعذّر تحليل القيمة المدخلة أنه رقم فعلاً سيُرجع القيمة الأصلية المدخلة.
|
|
|
+يقوم <span dir="ltr">`.number`</span> بتحويل القيمة المدخلة عبر `<input>` إلى رقم. في حال تعذّر تحليل القيمة المدخلة لرقم فعلاً سيُرجع القيمة الأصلية المدخلة.
|
|
|
|
|
|
**المُعدّل <span dir="ltr">`.debounce`</span>**
|
|
|
**المثال:** <span dir="ltr">`<input x-model.debounce="search">`</span>
|
|
@@ -528,7 +520,7 @@ import 'alpinejs'
|
|
|
|
|
|
**البُنية:** <span dir="ltr">`<span x-html="[expression]"`</span>
|
|
|
|
|
|
-يعمل بشكل مشابه لـ `x-bind`، ولكنه يقوم بتحديث شفرة HTML المضمنة `innerText` داخل العنصر.
|
|
|
+يعمل بشكل مشابه لـ `x-bind`، ولكنه يقوم بتحديث شفرة HTML المضمنة `innerText` داخل العنصر.
|
|
|
|
|
|
> :warning: **في هذه الحالة نوصي بكتابة محتوى (شفرات نظيفة) ولا تسمح بمُدخلات المُستخدم (user-provided)** :warning:
|
|
|
>
|
|
@@ -543,9 +535,9 @@ import 'alpinejs'
|
|
|
|
|
|
توفر `x-ref` طريقة مفيدة لجلب عناصر DOM خارج المكون الخاص بك، عندما تقوم بتعيين `x-ref` للعنصر، سيكون متاحاً لجميع معالجات الأحداث داخل الكائن عن طريق استدعاء `$refs`.
|
|
|
|
|
|
-بديل مفيد في حال كان يجب استخدام الأمر `document.querySelector` في كثير من الأحيان للإشارة إلى العناصر.
|
|
|
+يوفر ذلك بديلا مفيدا في حال كان يجب استخدام الأمر `document.querySelector` في كثير من الأحيان للإشارة إلى العناصر.
|
|
|
|
|
|
-> يمكنك أيضا عمل ربط القيم المتغيّرة (الديناميكية) بـ <span dir="ltr">`<span :x-ref="item.id"></span>`</span>.
|
|
|
+> يمكنك أيضا ربط القيم المتغيّرة (الديناميكية) بـ <span dir="ltr">`<span :x-ref="item.id"></span>`</span>.
|
|
|
|
|
|
---
|
|
|
|
|
@@ -556,7 +548,7 @@ import 'alpinejs'
|
|
|
|
|
|
إذا كانت وظيفة `x-show` (كما شرحناها سابقاً) غير كافية، فيمكن استخدام `x-if` بدلاً من ذلك لإزالة عنصر بالكامل من DOM.
|
|
|
|
|
|
-نظرًا لأن Alpine لا يحتوي على DOM افتراضي، يجب استخدام `x-if` مع الوسم `<template></template>`. بحيث يسمح لـ Alpine البقاء مستقرًا والوصول إلى DOM الحقيقي.
|
|
|
+نظرًا لأن Alpine لا يحتوي على DOM افتراضي، يجب استخدام `x-if` مع الوسم `<template></template>`. بحيث يسمح لـ Alpine بالبقاء مستقرًا والوصول إلى DOM الحقيقي.
|
|
|
|
|
|
> ملاحظة: عند استخدام `x-if`، يجب أن يكون هناك عنصر جذر واحد (element root) على الأقل داخل `<template></template>`
|
|
|
|
|
@@ -575,12 +567,13 @@ import 'alpinejs'
|
|
|
</template>
|
|
|
```
|
|
|
|
|
|
+> ملاحظة: الـ`:key` مفتاح اختياري، ومع ذلك، نوصى به.
|
|
|
</div>
|
|
|
|
|
|
|
|
|
> ملاحظة: هذا `:key` مفتاح اختياري ، ومع ذلك، نوصى به وبشدة.
|
|
|
|
|
|
-يُعدّ `x-for` مناسباً للحالات التي يلزم فيها انشاء عقدة DOM جديدة لكل عنصر داخل المصفوفة. مشابه لـ `v-for` في Vue، ولكن الإختلاف الوحيد هو أنه يجب وضعه في وسم `template` بدلاً من عنصر DOM عادي.
|
|
|
+يُعدّ `x-for` مناسباً للحالات التي يلزم فيها إنشاء عقدة DOM جديدة لكل عنصر داخل المصفوفة. مشابه لـ `v-for` في Vue، ولكن الاختلاف الوحيد هو أنه يجب وضعه في وسم `template` بدلاً من عنصر DOM عادي.
|
|
|
|
|
|
إذا كنت ترغب في الوصول إلى الفهرس الحالي (current index) للتكرار، فاستخدم الصيغة التالية:
|
|
|
|
|
@@ -602,7 +595,7 @@ import 'alpinejs'
|
|
|
<div x-text="item"></div>
|
|
|
<!--نفس العنصر المذكور أعلاه. -->
|
|
|
<div x-text="collection[index]"></div>
|
|
|
- <!-- لعنصر السابق. -->
|
|
|
+ <!-- العنصر السابق. -->
|
|
|
<div x-text="collection[index - 1]"></div>
|
|
|
</template>
|
|
|
```
|
|
@@ -614,7 +607,7 @@ import 'alpinejs'
|
|
|
> ملاحظة: عند استخدام template في svg، ستحتاج إلى إضافة [polyfill](https://github.com/alpinejs/alpine/issues/637#issuecomment-654856538) الذي يجب تنفيذه قبل تهيئة Alpine.js.
|
|
|
|
|
|
#### تداخل `x-for`
|
|
|
-يمكنك عمل حلقات تكرار داخل حلقات x-for ولكن يجب أن نلّف (wrap) كل دورة في عنصر. مثلا:
|
|
|
+يمكنك عمل حلقات تكرار داخل حلقات x-for ولكن يجب أن نلّف كل حلقة في عنصر. مثلا:
|
|
|
|
|
|
<div dir="ltr">
|
|
|
|
|
@@ -684,7 +677,7 @@ import 'alpinejs'
|
|
|
|
|
|
> المثال أعلاه يستخدم تنسيقات [Tailwind CSS](https://tailwindcss.com/)
|
|
|
|
|
|
-يوفر Alpine ستة تأثيرات إنتقالية مختلفة لتطبيق الفئات (Classes) على مراحل مختلفة من انتقال العنصر، بين الحالات "hidden" و "shown". تعمل هذه التوجيهات مع كل من `x-show` و `x-if`.
|
|
|
+يوفر Alpine ستة تأثيرات انتقالية مختلفة لتطبيق الفئات (Classes) على مراحل مختلفة من انتقال العنصر، بين الحالات "hidden" و "shown". تعمل هذه التوجيهات مع كل من x-show و x-if.
|
|
|
|
|
|
تعمل هذه تمامًا مثل توجيهات التأثير بـ VueJS، باستثناء أن لها أسماء مختلفة وأكثر منطقية:
|
|
|
|
|
@@ -738,11 +731,11 @@ import 'alpinejs'
|
|
|
|
|
|
يتيح `x-spread` نقل ربط الكائنات التي تحتوي على توجيهات Alpine لعنصر ما، إلى كائن يمكن إعادة استخدامه.
|
|
|
|
|
|
-مفاتيح الكائن (object keys) عبارة عن توجيهات (يمكن أن يكون أي توجيهات بما في ذلك المُعدّلات) والقيم عبرة عن عمليات callback يتم تنفيذ قيمها بواسطة Alpine.
|
|
|
+مفاتيح الكائن (object keys) عبارة عن توجيهات (يمكن أن يكون أي توجيهات بما في ذلك المُعدّلات) والقيم عبارة عن عمليات callback يتم تنفيذ قيمها بواسطة Alpine.
|
|
|
|
|
|
> ملاحظة: هناك بعض الأشياء التي يجب مراعاتها في `x-spread`:
|
|
|
-> - الحالة الخاصة الوحيدة لـ spread هي استخدامه مع `x-for`. عند تطبيقه على التوجيه `x-for`، يجب إرجاع تعليمات نصيّة (string) عادية بواسطة callback. كمثال <span dir="ltr">`['x-for']() { return 'item in items' }`</span>
|
|
|
-> - `x-data` و `x-init` لا يمكن إستخدامهما داخل كائن "spread".
|
|
|
+> - الحالة الخاصة الوحيدة لـ spread هي استخدامه مع `x-for`. عند تطبيقه على التوجيه `x-for`، يجب إرجاع تعليمات نصيّة عادية بواسطة callback. مثال span dir="ltr">`['x-for']() { return 'item in items' }`</span>
|
|
|
+> - `x-data` و `x-init` لا يمكن استخدامهما داخل كائن "spread".
|
|
|
|
|
|
---
|
|
|
|
|
@@ -764,7 +757,7 @@ import 'alpinejs'
|
|
|
|
|
|
### الخصائص السحرية
|
|
|
|
|
|
-> باستثناء <span dir="ltr">`$el`</span>، **لا يمكن استخدام الخصائص السحرية ضمن x-data** في حال المكوّن لم تتم تهيئته بعد.
|
|
|
+> باستثناء <span dir="ltr">$el</span>، **لا يمكن استخدام الخصائص السحرية ضمن x-data** في حال لم تتم تهيئة المكوّن بعد.
|
|
|
|
|
|
---
|
|
|
|
|
@@ -811,10 +804,9 @@ import 'alpinejs'
|
|
|
<input x-on:input="alert($event.target.value)">
|
|
|
```
|
|
|
|
|
|
+يرجع كائن الحدث "Event" الأصلي داخل المُنصت لأحداث المستخدم.
|
|
|
</div>
|
|
|
|
|
|
-يرجع كائن الحدث "Event" الأصلي داخل المُتنصت لأحداث المستخدم.
|
|
|
-
|
|
|
> ملاحظة: خاصية $event متاحة فقط في تعليمات DOM.
|
|
|
|
|
|
إذا أردت تمرير $event داخل دوال الجافاسكربت فيمكنك تمريرها مباشرة.
|
|
@@ -869,11 +861,9 @@ import 'alpinejs'
|
|
|
<div>
|
|
|
```
|
|
|
|
|
|
+> ملاحظة: المثال أعلاه لن يعمل بشكل جيّد. لأنه إذا تم تشغيل الحدث المخصص، فسيتم انتشار "تشغيله" في العناصر الرئيسة المشتركة بـ div.
|
|
|
</div>
|
|
|
|
|
|
-
|
|
|
-> ملاحظة: المثال أعلاه لن يعمل بشكل جيّد. لأنه إذا تم تشغيل الحدث المخصص، فسيتم انتشاره "تشغيله" في العناصر الرئيسية المشتركة بـ div.
|
|
|
-
|
|
|
**Dispatching to Components**
|
|
|
|
|
|
يمكن أيضًا استخدام الطريقة الموضحة أعلاه لتمكين الاتصال بين المكونات:
|
|
@@ -950,19 +940,16 @@ import 'alpinejs'
|
|
|
</div>
|
|
|
```
|
|
|
|
|
|
-</div>
|
|
|
-
|
|
|
-
|
|
|
-تمكّنك <span dir="ltr">`$watch`</span> في المثال أعلاه أنه عند الضغط فوق الزر "button" ويتم تفعليه `open`، يقوم callback بتنفيذ `console.log` وطباعة القيمة الجديدة.
|
|
|
+تمكّنك <span dir="ltr">`$watch`</span> في المثال أعلاه من تفعيل `open` عند الضغط على الزر "button"، يقوم callback بتنفيذ `console.log` وطباعة القيمة الجديدة.
|
|
|
|
|
|
## الحماية
|
|
|
إذا وجدت ثغرة أمنية، يُرجى إرسال بريد إلكتروني إلى: [calebporzio@gmail.com]().
|
|
|
|
|
|
-يعتمد Alpine على `function` لتنفيذ خصائصه. على الرغم من كونها أنها أكثرَ أماناً من <span dir="ltr">`eval()`</span> إلا أن هذه الممارسة مازالت محظورة في بعض البيئات المقيّدة مثل Google Chrome App باستخدام سياسة أمان المحتوى المقيد ([CSP](https://csp.withgoogle.com/docs/strict-csp.html)).
|
|
|
+يعتمد Alpine على `function` لتنفيذ خصائصه. على الرغم من كونها أكثرَ أماناً من <span dir="ltr">`eval()`</span> إلا أن هذه الممارسة مازالت محظورة في بعض البيئات المقيّدة مثل Google Chrome App باستخدام سياسة أمان المحتوى المقيد ([CSP](https://csp.withgoogle.com/docs/strict-csp.html)).
|
|
|
|
|
|
إذا كنت تستخدم Alpine في بيئة بها بيانات حساسة وتحتاج إلى [CSP](https://csp.withgoogle.com/docs/strict-csp.html)، فأنت بحاجة إلى تضمين التقييم غير الآمن `unsafe-eval` في سياستك. يساعد في وضع سياسات قوية على حماية المستخدمين عند استخدام المعلومات الشخصية والمالية.
|
|
|
|
|
|
-نظرًا لأن السياسة تنطبق على جميع البرامج النصية في صفحتك، فمن المهم أن تتم مراجعة المكتبات الخارجية الأخرى المضمنة في موقعك بعناية للتأكد من أنها جديرة لإستعمالها وآمنة ولن تقدم أي ثغرة أمنية XSS أو (Cross Site Scripting vulnerability) عبر الموقع سواء باستخدام وظيفة <span dir="ltr">`eval()`</span> أو التلاعب بـ DOM لإدخال تعليمات برمجية ضارة في صفحتك.
|
|
|
+نظرًا لأن السياسة تنطبق على جميع البرامج النصية في صفحتك، فمن المهم أن تتم مراجعة المكتبات الخارجية الأخرى المضمنة في موقعك بعناية للتأكد من أنها جديرة لاستعمالها وآمنة ولن تقدم أي ثغرة أمنية XSS أو (Cross Site Scripting vulnerability) عبر الموقع سواء باستخدام وظيفة <span dir="ltr">`eval()`</span> أو التلاعب بـ DOM لإدخال تعليمات برمجية ضارة في صفحتك.
|
|
|
|
|
|
## الرخصة
|
|
|
|
|
@@ -970,4 +957,4 @@ import 'alpinejs'
|
|
|
|
|
|
مرخص بموجب ترخيص MIT، راجع [LICENSE.md](LICENSE.md) للحصول على التفاصيل.
|
|
|
|
|
|
-</div>
|
|
|
+</div>
|