1

文字列要素を連結して、JavascriptでHTMLマークアップを作成しています。このようなもの:

var makeButton = function (el) {
    'use strict';
    var config = el.attr("data-config"),
        dyn = $.parseJSON(config),
        hover = false,
        state = 'up',
        hrf = '',
        ...

  if (dyn.href) {
      hrf = 'href="' + dyn.href + '" ';
  }
  ...

  // when all variables have been set, concat  
  iconspan = dyn.icon ? '<span class="ui-icon ' + icn + icp + ics + '">&nbsp;</span>' : '';
  textspan = '<span class="ui-btn-text">' + txt + '</span>';
  innerspan = '<span class="ui-btn-inner">' + textspan + iconspan + '</span>';
  btn = '<a data-role="button" data-wrapperels="span" class="ui-btn ' + hvr + cls + '" ' + data_icp + data_thm + data_min + data_inl + '>' + innerspan + '</a>';
  return btn;
};

すべてが設定されたら、文字列を呼び出し元の関数に返します。呼び出し元の関数で、作成中の他の文字列に挿入されます。私が作成しているものに関する情報を保存することは可能かどうか疑問に思っています。jQuery(= $( btn ))にインスタンス化していないため、。のようなものを使用して情報を追加することはできませんdata()

質問:
単純な「文字列」がある場合、その文字列に関する情報を格納するための代替手段(ある場合)はありますか?

4

2 に答える 2

1

それで、私が単純な「文字列」を持っている場合、その文字列に関する情報を格納するために(もしあれば)どのような選択肢がありますか?

なし。プリミティブ値にはプロパティを含めることができないためそれらに何も保存することはできません。オブジェクトに切り替えるか、情報を文字列値で識別される他の静的構造に格納します(もちろん、関数は固有の文字列を返す必要があり、ガベージコレクションはやや複雑です)。

Stringしたがって、返したい文字列をラップするオブジェクトを使用することができます。これらは、プリミティブ操作(連結など)でも同じ動作をしますが、追加情報を格納できます。

btn = new String(btn);
btn.data = …;
return btn;
于 2013-03-23T17:12:59.630 に答える
0

何を達成しようとしているのか完全にはわかりませんが(文字列を連結する代わりに、 mustache.jsアンダースコアテンプレートなどのテンプレート言語を検討する価値があるかもしれません)、データの2つの分散ビット間の関係を作成したい場合は次に、連想配列がその役割を果たします。

// Use a JavaScript object as an Associative Array.
dataByButtonMarkupMap = {};

// Build your button markup as before.
btnMarkup = "..."

// Use the markup as a Key in the associative array, don't worry that it's massive, as long
// as it's a string (or can be coerced to one), it can be used as a key.
dataByButtonMarkupMap[btnMarkup] = "some data";

// You can now retrieve that data via the button markup
var myData = dataByButtonMarkupMap[btnMarkup];

文字列を渡す代わりに、テンプレート文字列とデータの両方をカプセル化するオブジェクトを返すように、デザインをリファクタリングすることを検討する価値があるかもしれません。例:

function makeButton() { 
    // ...

    // Return an object instead of a string so you can encapsualte
    // additional data alongside the template string.
    return {
        template: btn,
        data: "some data"
    }
}

お役に立てば幸いです。

于 2013-03-23T16:47:09.667 に答える