2012-05-07 1 views
0

Я делаю первые шаги с помощью Knockout.js, чтобы сделать (довольно сложную) форму для расчета интров на неоплаченные счета-фактуры, учитывая частичные платежи, затраты и договорные штрафы.Нокаут js: создание нового имени ввода уникально

Расчеты будут обрабатываться на PHP, так как я более опытен в PHP, а затем в JS. Нокаут обрабатывает динамику добавления новых полей формы, делая форму гибкой для использования в самых сложных ситуациях.

Чтобы иметь возможность правильно извлечь данные, я буду служить три многомерные массивы через почту на PHP:

  • счета [$ я] [имя]/счета [$ я] [сумма]/счет-фактура [$ я] [дата]/...
  • платеж [$ J] [имя]/...
  • стоимость [$ к] [имя]/...

проблема что я, похоже, не могу решить в JS, состоит в том, что новый элемент формы должен быть сгенерирован Knockout.js и что уникальный онемение эр должен быть назначаемый с (я предполагаю)

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

Я посмотрел в UniqueName обязывающим, но мне нужно иметь три 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

Я не знаю, если я вас правильно понимаю, но взять Посмотрите, как «uniqueName» переплет, если определено here, и сделайте свое собственное обязательство, подобное этому - не должно быть слишком сложно - см. docs.

Другое уникальное значение - метка времени - взгляните на this jsfiddle Я сделал для вас - uniqName функция.

Удача :)

+0

Благодарим вас за ответ. Это может быть способ, но нужно немного подстроить: я создал три уникальных bindHandlers, но они действительно уникальны каждый раз, когда они применяются. В моей форме я хочу сделать 3 группы данных, каждая из которых в одном массиве. Итак, могу ли я сохранить значение element.name в переменной, которую я могу вызвать с привязкой attr? Таким образом, я мог бы использовать uniqueName-binding в первом поле формы и attr-привязку в других областях формы, которые я хочу сгруппировать в одном массиве ... Я сделал jsFiddle, чтобы показать мой код до сих пор: http: // jsfiddle.net/zenlord/WUDdG/ – zenlord

+0

Я немного потрудился с этой проблемой, и с обновленным нокаутом (v2.1.0) это легко можно решить через index() - var, который создается для каждого элемента foreach ... – zenlord

Смежные вопросы