Backbone: router.navigate لا يستدعي جهاز التوجيه ما لم يتم تغيير التجزئة

تم إنشاؤها على ٢ أكتوبر ٢٠١١  ·  22تعليقات  ·  مصدر: jashkenas/backbone

أحاول استخدام عناوين URL بدون علامات التجزئة التي تسبب بعض الحزن.

وأنا أختبر فعلت هذا.

<a href="#" onclick="router.navigate('/albums/<%= album.id %>', true); return false;">Show</a>

تم تحديث عنوان URL ولكن لم يتم استدعاء جهاز التوجيه الخاص بي. في البداية اعتقدت أن المسار لم يتطابق ولكن إذا قمت بتحديث الصفحة ، فسيتم مطابقة المسار بنجاح.

ثم حاولت هذا:

<a href="#" onclick="router.navigate('/albums/<%= album.id %>', true);">Show</a>

وكل شيء يعمل على ما يرام ، يبدو أن جهاز التوجيه لا يُستدعى إلا إذا تم تشغيل التجزئة.

التعليق الأكثر فائدة

يعد هذا بالفعل سلوكًا مثيرًا للاهتمام router.navigate() واجهته من قبل عند محاولة فرض إعادة تحميل المسار. هذا ما انتهى بي الأمر بفعله:

Backbone.history.loadUrl( Backbone.history.fragment )

هذا ليس موثقًا بشكل واضح كجزء من واجهة برمجة التطبيقات ، ولكنه بالتأكيد ينجز المهمة. يبدو من المنطقي بالنسبة لي أن router.navigate( 'current/path', true ) يجب أن يقوم بتشغيل معالج التوجيه ليتم استدعاؤه مرة أخرى.

أي شخص آخر يهتم بالتناغم مع هذا؟

ال 22 كومينتر

يعمل إذا قمت بإزالة الأولي /
أعتقد أنه يجب أن يكون مطابقًا تمامًا لمساراتك

يعد هذا بالفعل سلوكًا مثيرًا للاهتمام router.navigate() واجهته من قبل عند محاولة فرض إعادة تحميل المسار. هذا ما انتهى بي الأمر بفعله:

Backbone.history.loadUrl( Backbone.history.fragment )

هذا ليس موثقًا بشكل واضح كجزء من واجهة برمجة التطبيقات ، ولكنه بالتأكيد ينجز المهمة. يبدو من المنطقي بالنسبة لي أن router.navigate( 'current/path', true ) يجب أن يقوم بتشغيل معالج التوجيه ليتم استدعاؤه مرة أخرى.

أي شخص آخر يهتم بالتناغم مع هذا؟

واجهت هذه القضية أيضا. إليك حالة الاستخدام الخاصة بي:

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

router.navigate(Backbone.history.fragment, true)

أفضل عدم الإشارة إلى تاريخ العمود الفقري على الإطلاق. سيكون من الأفضل أن يكون لجهاز التوجيه طريقة تحديث أو إعادة تحميل:

router.refresh(true);

كان لي نفس القضية. Ansman هل يمكنك إظهار ما هي

نعم - لا يجب أن يكون لديك مطلقًا شرطة مائلة ... سواء في مساراتك أو في مكالماتك المنقولة (). ومع ذلك ، هناك التزام على السيد يزيل بقوة جميع الخطوط المائلة الرئيسية ، لذلك لا ينبغي أن يؤدي هذا بعد الآن إلى سلوك عربات التي تجرها الدواب.

أخيرًا ، نعم ، يجب ألا ينطلق جهاز التوجيه الخاص بك إلا إذا تم تغيير المسار بالفعل.

أرغب في إجراء رنين في ذلك ، يجب أن يؤدي استدعاء صريح إلى router.navigate ("المسار" ، صحيح) إلى تشغيل المسار حتى إذا لم يتم تغيير المسار في التجزئة

danroberts لا يبدو من الممكن في الوقت الحالي فرض تشغيل المسار إذا لم تتغير التجزئة. حاولت router.navigate ("route /"، {trigger: true})؛ وهو لا يعمل. الاختراق السريع هو ببساطة الاتصال بـ router.route_name() .

olalonde لقد كنت أستخدم طريقة

يبدو من المعقول أن يكون هذا جزءًا من مجموعة الخيارات ، شيء مثل التحديث: صحيح إذا كنت تريده أن يقوم بتشغيل المسار بغض النظر. أيضًا ، ربما يبدو تحديث الوثائق بالترتيب ، حيث أن {Trigger: true} سيؤدي منطقيًا إلى تشغيل المسار ...

ها هي المشكلة التي أواجهها مع إغلاق هذا الخطأ:

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

        if (url == window.location.pathname + window.location.search) {
            Backbone.history.loadUrl(url);
            return false;
        }
        else if (app.router.isHandled(url)) {
            Backbone.history.navigate(url, {
                trigger: true
            });
            return false;
        }

هل هذا ممكن؟ نعم ، لكن يبدو أن هذه حالة استخدام صالحة تمامًا سيكون من الجيد وجودها في النظام الأساسي.

لمعلوماتك رأيت رقم 1214 قبل هذا الموضوع ونشرت نفس التعليق.

لا يسمح Backbone Router بهذا النوع من الإجراءات لأنه يستمع إلى حدث تغيير عنوان url لتشغيل أي إجراءات موجهة.

تحتاج إلى اعتراض عنصر التحكم الذي أطلق الإجراء وإعادة تعيين إجراء الموجه.

لقد قمت بإنشاء مثال jsFiddle هنا:
http://goo.gl/wPulo

ومدونة هنا:
http://goo.gl/mJM2i

ركض في هذه المشكلة اليوم وأود فقط إضافة 2 سنت:

يبدو أنه سلوك غير بديهي أنه عند تعيين trigger: true بشكل صريح ، فلن يؤدي ذلك إلى تشغيل الحدث ما لم تتغير التجزئة.

تصويتي لصالح trigger: true لتشغيل المسار بغض النظر عن الحالة.

أحد الأمثلة في العالم الحقيقي هو عندما تريد تحديث الصفحة الحالية التي تتصفحها ، فسيكون من المستحيل القيام بذلك مع السلوك الحالي لـ trigger: true .

+1 لطريقة KenPerkins أو شيء مشابه ليتم دمجه في أجهزة توجيه BB.

+1 للتنقل في العملية على نفس الصفحة إذا تم تمرير {trigger: true}

لقد أمضيت 3 ساعات في محاولة لمعرفة سبب عدم نجاح طريقة roter.navigate() في طلبي. أعتقد أن مستندات BB يجب أن تتضمن إشعارًا حول هذه المشكلة.

كان الحل القبيح ولكن السريع هو استدعاء طريقة router.navigate() قبل الطريقة الفعلية.

router.navigate();
router.navigate("app", true);

في الوقت الحالي ، عملت. ولكن إذا كان هناك خيار refresh:true ، فسأستخدمه بالتأكيد ...

مجرد ترك أفكاري حول هذا لأنها مشكلة واجهتها اليوم للتو. يبدو أنه من غير المنطقي للغاية عدم استدعاء المسار عندما تقوم صراحة بتمرير تجزئة الخيارات {trigger: true} إلى router.navigate. أود أن أرى إضافة خيار refresh:true مثل onuradsay الذي اقترحه.

+1 للتطبيق العملي لفكرةpatrickod و onuradsay

+1. لا يزال بإمكاننا تلقي الحدث ثم تحديد ما إذا كان التحديث مطلوبًا في تطبيقنا. يمكننا معرفة ذلك من خلال العديد من الاختراقات المذكورة أعلاه ولكنها ليست نظيفة للغاية. أعتقد أن هذا السلوك شائع بما يكفي لوضعه في جهاز التوجيه.

أخشى أن هذا لن يحدث. حقيقة أن الناس يطلبون ذلك هي في الواقع دافع أكبر لإزالة _ trigger:true أكثر من إطلاق الحدث دون قيد أو شرط. دعني أشرح:

تدور الأحداث في العمود الفقري حول تلقي الإشعارات عند تغيير الحالة. تمامًا كما هو الحال في النماذج ، يتم القيام بما يلي:

model.set({title: "Boom"})
model.set({title: "Boom"})

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

إذا كنت ترغب في الحصول على نداء رد عند النقر على الزر - فقط أضف رد الاتصال. أو إذا كنت تريد استخدام أحداث Backbone للقيام بذلك - فقط اتصل بـ object.trigger ("myEvent")

يبدو أنه بدلاً من trigger:true ، يجب أن يفترض أنه صحيح ولديه خيار silent:false .

إذا لم نقم بإضافة هذه الوظيفة ، فسنضطر دائمًا إلى القيام بشيء مثل هذا في معالجات الأزرار لدينا -

if (Backbone.history.fragment === 'foo') {
    Backbone.history.loadUrl(Backbone.history.fragment);
 } else {
     router.navigate('foo', {'trigger': true});
}

شكرًا dankantor على الحيلة العظيمة!

إذا كان عليك القيام بحالة الاستخدام هذه (لفرض إعادة تحميل نفس الصفحة / التجزئة) ، ألا تريد Backbone.history.getFragment () بدلاً من history.fragment حتى لا تصل إلى خصائص السجل؟ يبدو أنظف.

لقد أنشأت طريقة Backbone.history.refresh لفرض إعادة التحميل. بعد ذلك ، في بعض المشاريع ، أتجاوز سلوك التنقل الافتراضي لإعادة التحميل بغض النظر عما إذا تم تغيير التجزئة:

      _.extend(Backbone.History.prototype, {
            refresh: function() {
                this.loadUrl(this.fragment);
            }
        });

        var routeStripper = /^[#\/]/;
        var origNavigate = Backbone.History.prototype.navigate;
        Backbone.History.prototype.navigate = function (fragment, options) {
            var frag = (fragment || '').replace(routeStripper, '');
            if (this.fragment == frag)
                this.refresh();
            else
                origNavigate.call(this, fragment, options);
        };
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات