হ্যান্ডলবারস / গোঁফ - কোনও জিনিসের বৈশিষ্ট্যগুলি লুপ করার মতো কোনও বিল্ট তৈরি আছে?


216

প্রশ্নের শিরোনামে যেমন বলা হয়েছে, কোনও বস্তুর বৈশিষ্ট্যগুলির মধ্য দিয়ে লুপিংয়ের গোঁফ / হ্যান্ডেলবারগুলি কী আছে ?

তাই দিয়ে

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
}

আমি কি তখন টেমপ্লেট ইঞ্জিনে এমন কিছু করতে পারি যা এর সমতুল্য হবে

for(var prop in o)
{
    // with say, prop a variable in the template and value the property value
}

?

উত্তর:


448

হ্যান্ডলেবার্স 1.0 সিআর 1 থেকে অন্তর্নির্মিত সমর্থন

Handlebars.js এ এই কার্যকারিতাটির জন্য সমর্থন যুক্ত করা হয়েছে , সুতরাং বাহ্যিক সহায়কদের আর কোনও প্রয়োজন নেই।

এটি কিভাবে ব্যবহার করতে

অ্যারেগুলির জন্য:

{{#each myArray}}
    Index: {{@index}} Value = {{this}}
{{/each}}

বস্তুর জন্য:

{{#each myObject}}
    Key: {{@key}} Value = {{this}}
{{/each}}

মনে রাখবেন যে কেবলমাত্র hasOwnPropertyপরীক্ষায় উত্তীর্ণ বৈশিষ্ট্যগুলি গণনা করা হবে।


2
@ রাফি: যদিও আপনার ডেটা স্ট্রাকচারটি না জেনেও কেউ এটির বেশি ধারণা করতে পারে না।
জন

3
@ রাফি: আপনি কি mean don't this.title}} বলতে চাইছেন না?
nevyn

2
@ কোডেনিনজা: সরল: উপরের উদাহরণগুলিতে আপনি যেভাবে মানগুলি উল্লেখ করেন - সেই সাথে {{#each this}}। আপনার শর্তাদির পছন্দটিও বিভ্রান্তিকর (কোনও বিষয়টিকে "শীর্ষ স্তর" করে তোলে এবং অন্যটি কী না "প্রাক-সংজ্ঞায়িত" কীগুলি হুবহু? ইত্যাদি) তাই আপনি এই ধারণাগুলি পুনরায় দেখাতে চাইতে পারেন।
জন

1
যদি ভুল না হয় তবে কেবল v1.1.0 দিয়ে এটি উপলব্ধ, তবে দুর্দান্ত উত্তরের জন্য ধন্যবাদ।
স্যারোটিনস

2
আপনি কেবলমাত্র বৈশিষ্ট্যের নির্দিষ্ট শ্বেত তালিকার জন্য এটি কীভাবে করবেন?
মার্কো প্রিন্স

70

সহায়ক হিসাবে এটি বাস্তবায়িত করা বেশ সহজ:

Handlebars.registerHelper('eachProperty', function(context, options) {
    var ret = "";
    for(var prop in context)
    {
        ret = ret + options.fn({property:prop,value:context[prop]});
    }
    return ret;
});

তারপরে এটির মতো ব্যবহার করুন:

{{#eachProperty object}}
    {{property}}: {{value}}<br/>
{{/eachProperty }}

2
দেখতে দুর্দান্ত, আপনার কি প্রোটোটাইপের বৈশিষ্ট্যগুলি নিয়ে পুনরাবৃত্তি হচ্ছে না তাই লুপের ভিতরে একটি hasnOnProperty চেক যোগ করার দরকার আছে?
monkeyboy

দুর্দান্ত সমাধান @ বেন। কেউ যদি এ্যাম্বারের সাথে এটি ব্যবহার করার চেষ্টা করে তবে সমাধানটি সমাধান করার জন্য নীচে আমার উত্তরটি দেখুন।
ফ্লেনফিশ

27

সম্পাদনা: হ্যান্ডলবারগুলির এখন এটি সম্পাদনের একটি অন্তর্নির্মিত উপায় রয়েছে; উপরে নির্বাচিত উত্তর দেখুন । সরল গোঁফের সাথে কাজ করার সময়, নীচেরটি এখনও প্রয়োগ হয়।

গোঁফ অ্যারেতে আইটেমগুলি নিয়ে পুনরাবৃত্তি করতে পারে। সুতরাং আমি গোঁফগুলি যেভাবে কাজ করতে পারে সেভাবে ফর্ম্যাট করে একটি পৃথক ডেটা অবজেক্ট তৈরি করার পরামর্শ দেব:

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
},
mustacheFormattedData = { 'people' : [] };

for (var prop in o){
  if (o.hasOwnProperty(prop)){
    mustacheFormattedData['people'].push({
      'key' : prop,
      'value' : o[prop]
     });
  }
}

এখন, আপনার গোঁফ টেমপ্লেট এমন কিছু হবে:

{{#people}}
  {{key}} : {{value}}
{{/people}}

এখানে "খালি খালি তালিকাগুলি" বিভাগটি দেখুন: https://github.com/janl/mustache.js


1
আপনার পরামর্শটি সহ শেষ হয়ে গেল কারণ আমাকে যাইহোক কিছু অতিরিক্ত সাব প্রোপার্টি পাস করতে হবে। সাহায্যের জন্য ধন্যবাদ!
বেন

অনেক ধন্যবাদ, আপনার ধারণাটি আমাকে বিকল্পের সন্ধানের অন্য এক দিন বাঁচিয়েছে। এই লাইনটি মূল গোঁফ ফরমেটেড ডেটা = people 'লোক': []};
ম্যাট

আপনি কীভাবে "ও" অবজেক্টের অ্যারে দিয়ে এটি করবেন?
red888

4

এটি অ্যাম্বারের সাথে ব্যবহারের জন্য @ বেনের উত্তর আপডেট হয়েছে ... নোট আপনাকে ব্যবহার করতে হবে Ember.getকারণ স্ট্রিং হিসাবে প্রসঙ্গটি পাস হয়েছে।

Ember.Handlebars.registerHelper('eachProperty', function(context, options) {
  var ret = "";
  var newContext = Ember.get(this, context);
  for(var prop in newContext)
  {
    if (newContext.hasOwnProperty(prop)) {
      ret = ret + options.fn({property:prop,value:newContext[prop]});
    }
  }
  return ret;
});

টেমপ্লেট:

{{#eachProperty object}}
  {{key}}: {{value}}<br/>
{{/eachProperty }}

ধন্যবাদ @ ফ্লাইএনফিশ প্রসঙ্গটি এম্বারে একটি স্ট্রিং ?? মনে হচ্ছে .. কিছুটা বিজোড়।
বেন

হ্যাঁ আমি সত্যই নিশ্চিত নই যেহেতু আমি আম্বরে নতুন এবং এখনও এর আশেপাশে আমার পথ সন্ধান করার চেষ্টা করছি।
ফ্লানফিশ

1

@ অমিতের উত্তরটি ভাল কারণ এটি গোঁফ এবং হ্যান্ডলবার উভয় ক্ষেত্রেই কাজ করবে।

কেবলমাত্র হ্যান্ডলবার্স-সমাধান হিসাবে, আমি কয়েকটি দেখেছি এবং আমি https://gist.github.com/1371586each_with_key এ ব্লক সহায়কটি পছন্দ করি ।

  • এটি আপনাকে প্রথমে পুনর্গঠন না করে অবজেক্ট লিটারেলের উপর পুনরাবৃত্তি করার অনুমতি দেয় এবং
  • এটি আপনাকে কী ভেরিয়েবল বলে তার উপর নিয়ন্ত্রণ দেয়। অন্যান্য অনেক সমাধান আপনি বস্তুর কীগুলি ব্যবহার করে নামে সম্পর্কে সতর্ক হতে হবে 'key', অথবা 'property'ইত্যাদি

ভাল লাগছে। অন্যান্য পাঠকদের জন্য কেবল একটি সতর্কতা: এই গিস্টটির "কী_ভ্যালু" সহায়তায় এটিতে একটি বাগ রয়েছে। এটি ঠিক করার জন্য মন্তব্যগুলি পড়ুন।
সাইরেনটিয়ান

0

বেনের সমাধানের জন্য ধন্যবাদ, আমার ব্যবহারের ক্ষেত্রে কেবলমাত্র নির্দিষ্ট ক্ষেত্রগুলি ক্রমে প্রদর্শন করতে

বস্তু সহ

কোড:

    handlebars.registerHelper('eachToDisplayProperty', function(context, toDisplays, options) {
    var ret = "";
    var toDisplayKeyList = toDisplays.split(",");
    for(var i = 0; i < toDisplayKeyList.length; i++) {
        toDisplayKey = toDisplayKeyList[i];
        if(context[toDisplayKey]) {
            ret = ret + options.fn({
                property : toDisplayKey,
                value : context[toDisplayKey]
            });
        }

    }
    return ret;
});

উত্স অবজেক্ট:

   { locationDesc:"abc", name:"ghi", description:"def", four:"you wont see this"}

টেমপ্লেট:

{{#eachToDisplayProperty this "locationDesc,description,name"}}
    <div>
        {{property}} --- {{value}}
    </div>
    {{/eachToDisplayProperty}}

আউটপুট:

locationDesc --- abc
description --- def
name --- ghi

0

এটি গোঁফজেজেএসের জন্য একটি সহায়ক ফাংশন, ডেটাটির পূর্ব-বিন্যাস ছাড়াই এবং রেন্ডারের সময় তা না পেয়ে।

var data = {
    valueFromMap: function() {
        return function(text, render) {
            // "this" will be an object with map key property
            // text will be color that we have between the mustache-tags
            // in the template
            // render is the function that mustache gives us

            // still need to loop since we have no idea what the key is
            // but there will only be one
            for ( var key in this) {
                if (this.hasOwnProperty(key)) {
                    return render(this[key][text]);
                }
            }
        };
    },

    list: {
        blueHorse: {
            color: 'blue'
        },

        redHorse: {
            color: 'red'
        }
    }
};

টেমপ্লেট:

{{#list}}
    {{#.}}<span>color: {{#valueFromMap}}color{{/valueFromMap}}</span> <br/>{{/.}}
{{/list}}

আউটপুট:

color: blue
color: red

(অর্ডার এলোমেলো হতে পারে - এটি একটি মানচিত্র) আপনি যদি চান মানচিত্রের উপাদানটি জানেন তবে এটি কার্যকর হতে পারে। জালিয়াতিপূর্ণ মূল্যবোধগুলির জন্য কেবল নজর রাখুন।


-1

আমি পুরানো সংস্করণ ব্যবহার করছিলাম 1.0.beta.6 হ্যান্ডেলবারগুলির , আমি মনে করি কোথাও কোথাও 1.1 - 1.3 এর মধ্যে এই কার্যকারিতাটি যুক্ত হয়েছিল, তাই 1.3.0 এ আপডেট করা সমস্যার সমাধান করেছে, এখানে ব্যবহারটি এখানে রয়েছে:

ব্যবহার:

{{#each object}}
  Key {{@key}} : Value {{this}}
{{/people}}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.