2012-05-07 4 views
0

私はKnockout.jsで私の最初の措置をとって、未払いの請求書のインテレストを計算するための(かなり複雑な)フォームを作成し、部分支払い、費用、契約上のペナルティを念頭に置いています。ノックアウトjs:新しい入力名をユニークにする

計算はPHPで処理されます.PHPで、JSでの経験は豊富です。ノックアウトは、新しいフォームフィールドを追加するダイナミクスを処理し、最も複雑な状況でも柔軟に使用できるようにします。

正しく、私はPHPにポストを介して3つの多次元配列を提供されるデータを抽出することができるようにする:

  • 請求書[$ i]と[名] /請求書[$ i]の[量] /請求書[$ i]の[日付]/...
  • 支払い[$ j]と[名]/...
  • コスト[$ k]の[名前]/...

問題私はJSで解決できないようですが、新しいフォーム要素はKnockout.jsによって生成され、一意の麻痺私は固有名結合に見てきた

data-bind="attr:{name: someFunctionToGiveUniqueName}" 

erが(私は推測)で割り当て可能でなければなりませんが、私は3 uniqueNamesを持っている必要があり、私は構造化されたデータを保持するために結果の名前をカスタマイズすることができるはずです。

これは私のViewModel(と、それはそれほどユニークでないネーミング・オブ・inputfieldsを除き、動作します)です:

 <script type="text/javascript"> 

     // Overall viewmodel 
     function ViewModel() { 
      var self = this; 

      // Data 
      self.Hoofdsom = ko.observableArray(); 
      self.Betaling = ko.observableArray(); 
      self.Kost  = ko.observableArray(); 

      self.hsBeschr = ko.observable(); 
      self.hsBedrag = ko.observable(); 
      self.hsVerval = ko.observable(); 

      self.hsIntr  = ko.observable(); 
      self.hsIntrType = ko.observable(); 

      self.hsSchadeType = ko.observable(); 
      self.hsSchadePerc = ko.observable(10); 
      self.hsSchadeMin = ko.observable(0); 
      self.hsSchadeMax = ko.observable(1500); 

      // Initial State 
      self.Hoofdsom.push("new"); 

      // Operations 
      self.addHoofdsom = function() { 
       self.Hoofdsom.push(self.Hoofdsom().length); 
      } 
      self.remHoofdsom = function(hfd){ 
       self.Hoofdsom.remove(hfd); 
      } 
      self.addBetaling = function() { 
       self.Betaling.push(self.Betaling().length); 
      } 
      self.remBetaling = function(bet){ 
       self.Betaling.remove(bet); 
      } 
      self.addKost = function() { 
       self.Kost.push(self.Kost().length); 
      } 
      self.remKost = function(kos){ 
       self.Kost.remove(kos); 
      } 
     } 

     // Apply bindings 
     ko.applyBindings(new ViewModel()); 

    </script> 

答えて

0

私は私が正しくあなたを理解していれば知っているが、取ることはありませんどのように"ユニークな名前"バインディングが定義されている場合はhereとこれに似た独自のバインディングを作成してください - あまりにも難しくはありません - docsを参照してください。

他のユニークな値はタイムスタンプです - 私があなたのために作ったthis jsfiddleを見てください - uniqName機能。

幸運:

+0

ありがとうございました。それは行く方法かもしれませんが、それはいくつかの微調整が必​​要です:私は3つのユニークなbindingHandlerを作成しましたが、それらは適用されるたびに本当にユニークです。私の形式では、3つのグループのデータを1つの配列にまとめたいと考えています。ですから、attr-bindingで呼び出せる変数にelement.name-valueを格納することはできますか?そのようにして、最初のformfieldでuniqueName-bindingを使用し、同じ配列でグループ化する他のformfieldsでattr-bindingを使用することができます。これまでのコードを表示するjsFiddleを作成しました:http:// jsfiddle.net/zenlord/WUDdG/ – zenlord

+0

私はこの問題で多少苦労しましたが、更新されたKnockout(v2.1.0)ではforeach-itemごとに作成されるindex()-varで簡単に解決できます。 – zenlord

関連する問題