انتقل إلى المحتوى

حفظ النتائج المحورية ​

محاور وإثراء ينتهي باستيعاب: المرشحون المختارون موجودون على اللوحة، الموسومة بالمحور الذي جلبهم، وليس في أي مكان آخر. save هي خطوة للخلف — ال يكتب المحور نتائجه الخاصة في النظام الذي جاءت منه، وتحتفظ المكتبة بالكتب على ما عبر.

summarize  →  fetch  →  triage  →  ingest  →  save
  "2,143"     the 210    the 12    on canvas   in the source system

المكتبة لا تكتب أبدًا في أي مكان بنفسها ولا تحمل أي أوراق اعتماد. ما يساهم به هو مسك الدفاتر - ما هي العناصر التي تم إنشاؤها أثناء التشغيل، وما إذا كانت مكتوبة، وما هي تلك العناصر فشل، وما يجب أن تحمله إعادة المحاولة - لأن هذا هو الجزء الوحيد الذي يعرفه.

اعلان واحد ​

js
const objects = {
    id: 'objects',
    label: 'Objects & attributes',
    fetch: (nodes, narrowing, ctx) => api.objects(nodes[0].id, { signal: ctx.signal }),

    save: async ({ origin, nodes, children, edges }, ctx) => {
        const written = await api.createObjects(origin[0].id, [...nodes, ...children], {
            signal: ctx.signal,
        })
        return {
            savedNodeIds: written.ok.map(o => o.localId),
            savedEdgeIds: edges.map(e => e.id),
            canonicalIds: Object.fromEntries(written.ok.map(o => [o.localId, o.uuid])),
            message: written.failed.length ? `${written.failed.length} refused` : undefined,
        }
    },
}

الحمولة عبارة عن كائنات رسم بياني مباشر، وليست أجزاء أولية:

الميدانما يحمله
originما تم تشغيل المحور عليه - "ما الحدث الذي يرتبط به هذا"
nodesالعقد التي أنشأها هذا التشغيل
childrenمحتويات الحاوية المضافة إلى الاتحاد، مسطحة؛ يمكن الوصول لكل منها من حاويتها عبر parentNode
edgesالحواف التي أنشأها هذا التشغيل
vouchedما كان موجودًا بالفعل على القماش قبل هذا السباق
attempt1 في المرة الأولى، أعلى عند إعادة المحاولة

حذف save ونتائج المحور غير قابلة للحفظ. لا تدخل إلى دفتر الأستاذ أبدًا، فهي لم يتم احتسابها مطلقًا على أنها غير محفوظة، ولا يظهر أي حفظ لها. هذا هو الإعلان الصحيح ل قم بالتركيز على البيانات المشتقة - مخرجات محرك الارتباط ليست ملكًا لك لتكتبها مرة أخرى - وهي كذلك هو ما يوقف "210 غير محفوظ" دائمًا بدون علاج.

ما ترجع ​

عاديعني
undefined / trueتمت كتابة الحمولة بأكملها
false، أو الرميلم يكن أي منها؛ يصل الخطأ إلى نخب إعادة المحاولة
{ savedNodeIds, savedEdgeIds }كتابة جزئية — أي شيء غير مسمى يظل غير محفوظ
{ canonicalIds }معرفات النظام المصدر المعين، مرتبطا بالمعرف المحلي
{ message }يظهر حرفيا في نخب النتيجة
{ cancelled: true }تراجع المحلل: لم يتم تسجيل أي شيء، لا نخب، ولا محاولة

savedNodeIds يغطي nodes و children معًا. معرف يسمي أحد العناصر التي قام بها هذا التشغيل يتم تجاهل عدم الإنشاء: لا يكتب المحور أبدًا ما لم ينتجه، لذلك لا يمكنه الإبلاغ عنه مكتوب سواء.

يتم أخذ عملية الحفظ التي تشير إلى حافة مكتوبة ولكن ليس العقد التي تتصل بها في ظاهرها. ما يقوله النظام المصدر أنه كتبه ليس من حق المكتبة أن تنقضه.

اسأل المحلل أولا ​

تحتاج الكتابة أحيانًا إلى إجابة واحدة قبل أن تتم، مثل العلاقة التي تربط كل منهما النتيجة إلى العقدة التي تم إثرائها منها. ctx.promptData يفتح النموذج الخاص بالمكتبة، بنفس الخيارات الموجودة خلف إنشاء العقدة والحافة: التعريفي fields، أو render + getValues خاصتك HTML. فإنه يتحول إلى القيم، أو null عند الإلغاء.

js
save: async (payload, ctx) => {
    const answer = await ctx.promptData({
        fields: [{ key: 'relationship', label: 'Relationship', type: 'text', defaultValue: 'related-to' }],
    })
    if (!answer) return { cancelled: true }
    await api.attach(payload, answer.relationship, { signal: ctx.signal })
},

يتم تسمية النموذج وإرساله بـ حفظ ما لم يقل title وsubmitLabel خلاف ذلك. العودة { cancelled: true } تترك السباق تمامًا كما كان قبل انقر: لا يزال غير محفوظ، لا يوجد نخب، لا إعادة المحاولة، والمحاولة التالية لا تزال attempt: 1. حفظ على مدى عدة عمليات توقف عند الإلغاء الأول، ويحسبها التقرير تحت cancelled وليس كفشل. إعادة المحاولة الملغاة تعيد نخبها كما كانت.

لا يمكن أن يطلب سوى الحفظ الذي نقر عليه الشخص. حفظ في اللوحة المحورية، وحفظ في جزء المراجعة، و تمرير إعادة محاولة النخب interactive: true; autoSave وسهل graph.pivots.save() القيام لا، لذا فإن promptData يحل null مرة واحدة دون أي شيء مرسوم. مضيف مع حفظ زر خاص به يمرر العلم أيضًا:

js
await graph.pivots.save(undefined, { interactive: true })

يسأل عن واحد ​

js
await graph.pivots.save()          // every savable run with something still unsaved
await graph.pivots.save(runId)     // one run
await graph.pivots.save(pivotId)   // every unsaved run of one pivot

graph.pivots.unsaved()             // the runs still waiting
graph.pivots.unsavedCount()        // { nodes, edges } — exact, not advisory
graph.pivots.unsavedCount(pivotId) // one pivot's share of it
graph.pivots.isSaved(node)         // false for the unsaved *and* the not-savable
graph.pivots.isSavable(node)       // which of those two it is

جزء من الجري ​

js
const selected = graph.renderer.getGraphInteraction().getSelectedNodeIDs() ?? []
await graph.pivots.save({ elements: selected })   // Nodes, Edges or their ids

يتم سؤال كل تشغيل أنشأ أحد العناصر المسماة مرة واحدة، مع تضييق الحمولة إلى ما كان اسمه. العقدة المسماة تضع الأطفال المعلقين تحتها، وتأتي الحافة معها عندما يتم تسمية أحد الطرفين ويتم تسمية الطرف الآخر أيضًا أو لن يتم تركه بدون كتابة: الأصل، أو العقدة المحفوظة بالفعل، أو أي شيء لا ينتظره دفتر الأستاذ. حافة لانتظار تبقى العقدة المتروكة في الخلف معها، لذا فإن الكتابة لا ترسل سطرًا إلى لا شيء أبدًا. اسمه يتم تجاهل العناصر التي لا يوجد شيء ينتظرها، وتحصل المكالمة على نخب واحد لكل تشغيل لها سأل.

يبقى الباقي معلقًا، ويتم احتسابه، وإعادة المحاولة وcanonicalIds تعمل كما تفعل تمامًا تشغيل. يتم وضع علامة استمرار التشغيل في السجل بمجرد عدم ترك أي شيء منه للكتابة. isSavable(el) وisSaved(el) يوضحان ما إذا كان إدخال القائمة مثل حفظ المحدد قد تم أي شيء للقيام به.

تتم عمليات التشغيل واحدة تلو الأخرى، ويتم إرسال كل منها فقط لما لم يتم حفظه - لذا فإن إعادة المحاولة هي نفسها اتصل. تصل النتيجة كنخب: Saved 12 nodes، أو Saved 9 of 12 مع إعادة المحاولة الذي يتولى نفس الخبز المحمص بدلاً من تكديس خبز آخر.

في واجهة المستخدم، يوجد العد والزر أسفل اللوحة المحورية وجزء المراجعة يحمل حصة المزود الخاص به في رأسه. لا يظهر شيء عندما يكون الرقم صفراً.

كلاهما يكتبان كل شيء معلقًا، دون أي طريقة للاختيار. أحد التطبيقات التي توفر الادخار في مكان آخر، مثل الإدخال حفظ المحدد في قائمة العقدة، يمكنه إيقاف تشغيلها:

js
new Pivotick(el, data, { pivots: [objects], pivotSaveControls: false })
graph.pivots.saveControls = true   // and back, at runtime

فقط الضوابط اثنين تذهب. دفتر الأستاذ، التهم، save(...)، نخبه وإعادة المحاولة، و canonicalIds العمل كما في السابق.

autoSave: true يكتب كل شوط لحظة هبوطه، بدون إيماءة. يتم تشغيله بعد استيعاب الحلول بدلاً من داخلها، لذا فإن الواجهة الخلفية البطيئة لا تعيق اللوحة القماشية أبدًا، و تقارير الفشل من خلال المخطر ويترك البيانات حيث هي. إقرانها مع autoIngest: true لمحور يتم فيه عدم التدخل من البداية إلى النهاية - توسيع الحدث إلى الكائنات التي هي بالفعل ملك للمصدر.

معرفات النعناع النظام المصدر ​

عادة ما يؤدي الحفظ إلى إنشاء شيء ما، وعادةً ما يحصل الشيء الذي تم إنشاؤه على معرف المصدر اختيار النظام، وليس النظام الذي استخدمه مزود الخدمة الخاص بك عندما كان مرشحًا. تشغيل الغد ثم تقوم بإرجاع نفس الكائنات تحت معرفات dedup التي لا تتعرف عليها، ويحصل المحلل على اثني عشر نسخ مكررة مما حفظوه بالأمس.

ارجع canonicalIds وتحتفظ المكتبة بالاسم المستعار. استيعاب dedup، اتحاد الأطفال و جميع نقاط نهاية الحافة تستشيرها، لذا فإن إعادة التشغيل تقول 12 موجودة بالفعل على اللوحة القماشية بدلاً من ذلك.

js
graph.pivots.canonicalId(node)   // 'a1b2…' — the id the source assigned
لماذا تحتفظ العقدة بالمعرف الذي هبطت تحته

ستصل إعادة المفاتيح إلى الحواف والمجموعات والاختيار ومحرك الاستعلام والمصدر و التاريخ، لمصلحة الاسم المستعار يسلم بالفعل حيثما يهم. التكلفة الصادقة: graph.getNode(canonicalId) لا يزال يخطئ، وcanonicalId() هو القراءة التي لا تخطئ.

التراجع لا يصل إلى النظام المصدر ​

يؤدي التراجع عن التشغيل المحفوظ إلى إزالة العقد الخاصة به من اللوحة القماشية. لا لا إزالة أي شيء من النظام الذي تمت كتابتها إليه، ولا تصدر المكتبة أي كتابات تعويضية: التراجع عن أ العرض المحلي ليس معاملة عبر نظامين.

يقول التاريخ ذلك بدلاً من تركك لتكتشف ذلك: التشغيل الذي تم وضع علامة مكتوب عليه هو متكسرة تم الحفظ، ويحسب تذييل القائمة ما ستتركه المسافة وراءها. PivotRun يحمل عدد saved للسطح الذي يريد التحذير قبل النقر. انظر التراجع والتاريخ لكيفية تعامله مع الإدخال المستمر.

الحفظ الفاشل لا يمس اللوحة القماشية أيضًا. قبل المحلل تلك العقد الاثنتي عشرة؛ أ رفض الواجهة الخلفية هو معلومات حول الواجهة الخلفية، وليس تراجعًا عن قرارهم. هم البقاء، والبقاء غير محفوظ، والبقاء قابلاً لإعادة المحاولة.

وضع علامة على العقد غير المحفوظة ​

js
new Pivotick(el, data, { pivots: [objects], pivotMarkUnsaved: true })

يضع فئة pvt-node-unsaved على كل عقدة تم إنشاؤها ولم تتم إعادة كتابتها، وهو ما يمكن التقاط ورقة الأنماط — الافتراضي هو حافة متقطعة. قبالة افتراضيا، وفئة بدلا من ذلك من شارة الحافة: تحتوي العقدة على أربع زوايا حافة واثنتين فقط بمجرد أن يكون لديها أطفال، و أ العلامة التي تدفع الإمكانات المعلنة بعيدًا عن الحافة تكلف أكثر مما تقول.