2012-01-10 7 views
3

この問題を解決するには、いくつかのアプローチを取ってきましたが、私のソリューションの柔軟性には本当に満足していません。私はjavascriptで作成されたオブジェクトを自分のhtmlドキュメントのコンテナにマップしようとしています。HTMLコンテナへのJavascriptオブジェクトの一致

例を挙げておきます。

var PhoneNumber = function(number, type) { 
    this.number = number; 
    this.type = type; 
} 

var myPhone = new PhoneNumber('5555555555', 'Home'); 

そして、私のHTMLドキュメント内、私は基本的にforementionedオブジェクトによって移入して、ユーザに表示されるのを待って、空のコンテナですDIVの一連のを持っている:私はJavaScriptで電話番号のオブジェクトを持っていると言います。

<div id="phoneNumberContainer"> 
    <div class="row">   
     <div id="number"></div> 
     <div id="type"></div> 
    </div> 
</div> 

は今、私は自動的にその電話番号のオブジェクトを取得し、そのデータをphoneNumberContainer要素を記入します私のjavascript内の関数を持っていると思います。私は異なるパラメータを持つオブジェクトの複数のタイプを持っているので、それは一般的でなければなりません。

は現在、私は自分自身は、この多くのをやって見つける:

もちろんうまく動作しますが、一つ一つのオブジェクトのために何度も何度も同じコードの多くを書くための呼び出しは、私がしたい
function mapPhoneNumber() { 
    var numberContainer = document.getElementById('number'); 
    numberContainer.innerHTML = myPhone.number; 

    var typeContainer = document.getElementById('type'); 
    typeContainer.innerHTML = myPhone.type; 
} 

地図。私はので、私はちょうど関数にオブジェクトやコンテナを渡すことができますし、それが自動的にオブジェクトに基づいてDIV要素を取り込み、このようにそれを行う方法があったことを望む:もちろん

function mapPhoneNumber(phoneObject) { 
    var phoneContainerChildren = document.getElementById('phoneNumberContainer').childNodes; 
    for(x in phoneContainerChildren) { 
     phoneContainerChildren[x] = myPhone.number; 
    } 
} 

これは実施例ではありませんコンテナの順番が電話番号オブジェクトと同じであることが保証されていないため、子供はdivなどの横に他のタイプのノードを持ちます。電話番号パラメータ名をDIV要素の実際のIDに入れることができますそれをオブジェクトと照合して一致したオブジェクトを埋めますが、別のデザイナーによって変更された場合、私のjavascriptが完全に破壊されるようなDIV要素にそのような特定のIDを持つ必要はありません。

誰かが私のような何かを実装する方法についての提案はありますか?私はjQueryに反対しているわけではありません。

+1

「id = "phoneNumberContainer"、 'id =" number "'、 'id =" type "' "のオブジェクトを複数持っていますか?もしそうなら、あなたはそれをすることはできません。それらをクラスに変更します。与えられたIDはページごとに1回しか使用できません。 – jfriend00

+0

私のhtmlでは、phoneNumberContainerは本質的にテンプレートです。私はIDを使用して全体にクローンを作成し、データを入力してからHTMLに戻します。私は多かれ少なかれ手動ではなく、コンテナの子を自動的に埋める方法に関心を持っています。 – ryandlf

+1

矛盾したIDをクローンした後に取り除きますか? idsの代わりにクラスをどのように使用したかについては、私の答えを見てください。 – jfriend00

答えて

0

は、私は100%確実ではないが、私は、これは可能な解決策かもしれないと思うのための:

myPhone.writeToDOM(jQuery('#myPhone')); 

var DOMable = { 
    writeToDOM : function(node){ 
    for(var i in this) if(this.hasOwnProperty(i)){ 
     node.find("." + i).text(this[i]); 
    } 
    } 
}; 
var PhoneNumber = function(number, type) { 
    this.number = number; 
    this.type = type; 
}; 
PhoneNumber.prototype = DOMable; 

var myPhone = new PhoneNumber('5555555555', 'Home'); 

が次にあなたが呼び出すことができます

<div id="myPhone"> 
    <div class="number"> 
    </div> 
    <div class="type"> 
    </div> 
</div> 
+0

ここで問題となるのは、クラス名をオブジェクトパラメータに正確に一致させることです。別のデザイナー/開発者がそのクラス名を変更した場合、私は困っています。私は私の唯一の選択肢は、HTMLをjsと緊密に統合することです。( – ryandlf

+0

デザイナーが思慮深くHTMLのクラスを置き換えて削除すると、生き残るWWW全体でJavaScriptを使用しているサイトはほとんどありません。 (さらに、4.コード行の '.'を'# 'で置き換えるだけでなく、クラスの代わりにIDのためにも働きます。 – Matmarbon

+0

責任ある従業員はいませんが、私は物事については肛門になりたいと思っています。私はあなたの解決策が最高です。受け入れられる! – ryandlf

0

私はこれに似た何かを自分のプロジェクトの多くで使っています。

<div id="container"> 
    <div class="row">   
     <div class="prop"></div> 
     <div class="propValue"></div> 
    </div> 
</div> 

function BindValues(container, prop, propValue) 
{ 
    container.find(".prop").val = prop; 
    container.find(".propValue").val = propValue; 
return container; 
} 
+0

私はまだ、私がすでにやっているのと同じように聞こえる各オブジェクトの各要素にプロパティと値を渡す必要があります。 – ryandlf

+0

複数のキー値タイプを使用できます。元の方法は入力されたオブジェクトに基づいており、入力した電話番号でのみ機能します。 – FiveTools

0

あなたはあなたの電話番号オブジェクトにメソッドを追加し、ページごとに複数のを持つことができますので、あなたのHTMLの代わりに、IDの中でクラスを使用することができます。その後、すべてのコードがオブジェクトに添付されていて、毎回それを再入力する必要はありません、あなたはそれをしたい:

<div id="homePhone" class="phoneNumberContainer"> 
    <div class="row">   
     <div class="number"></div> 
     <div class="type"></div> 
    </div> 
</div> 

var PhoneNumber = function(number, type) { 
    this.number = number; 
    this.type = type; 
} 

PhoneNumber.prototype.setHTML(dest) { 
    var item = $(dest); 
    item.find(".type").html(this.type); 
    item.find(".number").html(this.number); 
} 

var myPhone = new PhoneNumber('5555555555', 'Home'); 
myPhone.setHTML("#homePhone"); 

が、これはもはや自動的に電話番号の作成方法についての詳細を知っている私たちを必要とするためには、どのようにHTMLが作成され、どのように自動的に他のものと関連付けることができますか?対応するHTMLの束を作成したいだけのPhoneNumberオブジェクトのリストがありますか?あるいは、HTMLがすでに存在し、それを埋めたいのですか?それはあなたが探しているものかどう

+0

私はすでにこの種のシステムをセットアップしています。問題は、さまざまな種類のオブジェクト(電話番号、電子メール、住所、市、州などなど)があり、それぞれをそれぞれのコンテナにマップする機能を1つだけ維持できることです。彼らはどのように動作するのかは全く同じオブジェクトですが、異なるパラメータがあります。 – ryandlf

+0

申し訳ありませんが、あなたが今までに説明したことからあなたが本当に解決しようとしている問題を理解できません。 – jfriend00

+0

mapPhoneNumber関数をすべてのオブジェクトに対して繰り返すのではなく、IDはコンテナとデータを渡すことができるmapAnyObject関数のようなものがあり、コンテナ内のdivを自動的に設定します。このようにして、マッピングの仕組みを変更したり、将来的に何かを追加したい場合は、基本的にまったく同じことを行う5つ、10つ、または20種類の関数とは対照的に、1つの関数を編集するだけです。 – ryandlf

関連する問題