Handlebars.js: طلب الميزة: مساعد "ربط" مدمج

تم إنشاؤها على ٢٧ أكتوبر ٢٠١١  ·  8تعليقات  ·  مصدر: handlebars-lang/handlebars.js

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

على سبيل المثال ، قد يحتوي القالب على شيء مثل هذا:

 {{join myArray delimiter=", "}}

انتهى بي الأمر بتسجيل المساعد الخاص بي لتلبية احتياجاتي العاجلة:

Handlebars.registerHelper("join", function(context, block) {
     return context.join(block.hash.delimiter);
});

يجب تعديل هذا للتعامل مع الحالات عندما يكون السياق فارغًا ، والسياق ليس مصفوفة ، والمحدد فارغ ، وما إلى ذلك.

feature

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

بالنسبة للعقدة:

Handlebars.registerHelper( "join", function( array, sep, options ) {
    return array.map(function( item ) {
        return options.fn( item );
    }).join( sep );
});
<p>
    {{#join companies "<br>"}}
        {{name}}
    {{/join}}
</p>

ال 8 كومينتر

لقد فعلت هذا لنفسي اليوم:

Handlebars.registerHelper('join', function(val, delimiter, start, end) { 
    return [].concat(val).slice(start, end).join(delimiter); 
});

إذا لم يكن val مصفوفة ، فسيكون له تأثير إرجاع val فقط. تعتبر المعلمات من الثاني إلى الرابع اختيارية تمامًا (المحدد الافتراضي هو "،"). لقد اختبرت فقط على Chrome حتى الآن.

تحديث: هذا يكسر في IE8. يسترجع [...].slice(undefined, undefined) مصفوفة فارغة بدلاً من المصفوفة بأكملها كما هو الحال في المتصفحات الأخرى. أيضًا ، إذا لم تقدم محددًا في تعريف القالب الخاص بك ، فسيقوم المؤشر بتمرير كائن التجزئة باعتباره المحدد ، والذي يعرضه IE كـ "[كائن]" بدلاً من فاصلة مثل المتصفحات الأخرى. تبدو نسختي المنقحة كما يلي:

Handlebars.registerHelper('join', function(val, delimiter, start, end) {
    var arry = [].concat(val);
    delimiter = ( typeof delimiter == "string" ? delimiter : ',' );
    start = start || 0;
    end = ( end === undefined ? arry.length : end );
    return arry.slice(start, end).join(delimiter); 
});

ليست أنيقة تمامًا ، ولكن التحقق من صحة المدخلات الخاصة بك ربما يكون ممارسة جيدة.

- تشاد

لقد أدرجت اقتراحات سيبرلي:

//Handlebars "join" block helper that supports arrays of objects or strings.  
//If "delimiter" is not speficified, then it defaults to ",".  You can use "start", 
//and "end" to do a "slice" of the array.

Handlebars.registerHelper('join', function(items, block) {
    var delimiter = block.hash.delimiter || ",", 
        start = start = block.hash.start || 0, 
        len = items ? items.length : 0,
        end = block.hash.end || len,
        out = "";

        if(end > len) end = len;

    if ('function' === typeof block) {
        for (i = start; i < end; i++) {
            if (i > start) out += delimiter;
            out += block(items[i]);
            if('string' === typeof items[i])
                out += items[i];
            else
                out += block(items[i]);
        }
        return out;
    } else { 
        return [].concat(items).slice(start, end).join(delimiter);
    }
});

عفوًا ، قصدت إخراج سطر واحد:

//Handlebars "join" block helper that supports arrays of objects or strings.  
//If "delimiter" is not speficified, then it defaults to ",".  You can use "start", 
//and "end" to do a "slice" of the array.

Handlebars.registerHelper('join', function(items, block) {
    var delimiter = block.hash.delimiter || ",", 
        start = start = block.hash.start || 0, 
        len = items ? items.length : 0,
        end = block.hash.end || len,
        out = "";

        if(end > len) end = len;

    if ('function' === typeof block) {
        for (i = start; i < end; i++) {
            if (i > start) 
                out += delimiter;
            if('string' === typeof items[i])
                out += items[i];
            else
                out += block(items[i]);
        }
        return out;
    } else { 
        return [].concat(items).slice(start, end).join(delimiter);
    }
});

jlubean : ما هو إصدار المقاود الذي تستخدمه؟ لا يمكنني تشغيله مع إصدار بيتا 4 كحد أقصى. لقد تلقيت الخطأ التالي عند استخدام بناء الجملة مثل:

{{join list_of_words delimiter=","}}

الخطأ:

Uncaught Error: Parse error on line 35:
..._of_words delimiter=&quot;,&quot;}}</tex
-----------------------^
Expecting 'STRING', 'INTEGER', 'BOOLEAN', 'ID'

كنت أستخدم الإصدار التجريبي 3. ألق نظرة على مثال عملي على http://jsfiddle.net/jlubean/YS3EV/

لقد كتبت هذا: http://mametipsum.herokuapp.com/. أفضل عدم مطالبة الأشخاص بتحديد مساعد مثل هذا (راجع علامة التبويب "النموذج"). أود أن أبقيه بسيطًا. أريد أن تكون المسافات هي الإعداد الافتراضي عند طباعة مصفوفة. يسعدني تجاوز مساعد المصفوفة الافتراضي ، ولكن كيف أفعل ذلك؟ شكرا.

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

بالنسبة للعقدة:

Handlebars.registerHelper( "join", function( array, sep, options ) {
    return array.map(function( item ) {
        return options.fn( item );
    }).join( sep );
});
<p>
    {{#join companies "<br>"}}
        {{name}}
    {{/join}}
</p>
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات