2013-06-18 3 views
0

Как говорится в названии, я пытаюсь добавить значение от наблюдаемого к другому наблюдаемому. Я получаю странные результаты, и мне интересно, правильно ли я делаю это.Добавление наблюдаемого значения в другое наблюдаемое

FIDDLE НА НИЖНЕЙ

HTML:

<div id="wrapper"> 
    <ul class="empiriHelp" data-bind="foreach: empiriHelp"><li data-bind="text: title"></li></ul> 
     <ul class="empiricount" data-bind="foreach: $data.empiriLines"> 
      <li data-bind='event: {mouseover: $root.empiriMouseOver, mouseleave: $root.empiriMouseLeave}'> 
       <input class="empiri_amount" data-bind="value: $data.amount"/> 
       <select data-bind="options: $root.measurements, value: $data.unit = $root.selectedUnit"></select> 
       <input class="empiri_ingredient" type="text" data-bind="value: $data.ingredient, returnKey: $root.empiriAddLine.bind($data, $index())" /> 
       <div class="empiri_fader"> 
        <div class="empiri_add" data-bind="click: $root.empiriAddLine.bind($data, $index())"></div> 
        <div class="empiri_delete" data-bind="click: $root.empiriRemoveLine.bind($data, $index())"></div> 
       </div> 
      </li> 
     </ul> 
    </ul> 
</div> 

Javascript:

$(document).ready(function() 
{ 
    var viewModel = function(){ 
    var self = this; 

    self.selectedUnit = ko.observable(); 

    self.selectedUnit.subscribe(function(value) { 
     console.log(value); 
    }); 

    self.measurements = ko.observableArray([ 
              ko.observable('Kg'), 
              ko.observable('g'), 
              ko.observable('L'), 
              ko.observable('dl'), 
              ko.observable('cl'), 
              ko.observable('tbps'), 
              ko.observable('tsp'), 
              ko.observable('cl') 
              ]); 

    self.empiriHelp = [{title: "amount"}, {title: "unit"}, {title: "ingredient"}]; 
    self.empiriLines = ko.observableArray([{ amount: ko.observable(''), unit: ko.observable(self.measurements[0]), ingredient: ko.observable('') }]); 


    self.empiriAddLine = function(index){ 
     self.empiriLines.splice(index+1,0,{ amount: ko.observable(''), unit: ko.observable(self.measurements[0]), ingredient: ko.observable('') }); 
    } 

    self.empiriRemoveLine = function(index){ 
     if(self.empiriLines().length!=1){ 
      self.empiriLines.splice(index,1); 
     } 
    } 

    self.empiriMouseOver = function(data, event){ 
     $(event.currentTarget).find(".empiri_fader").stop(true, true).fadeIn(200); 
    } 

    self.empiriMouseLeave = function(data, event){ 
     $(event.currentTarget).find(".empiri_fader").stop(true, true).fadeOut(200); 
    } 
} 

ko.applyBindings(new viewModel); 

Вопрос заключается в том, что, когда выберите значение изменяется, она изменяет значение на ВСЕХ empirilines, которые я не понимаю ... не должны ли данные данных быть чувствительными к контексту и ссылаться только на текущий элемент цикла из foreach? Я предполагаю, что я привязываю наблюдаемые неправильно. Я слишком долго стучал головой об этом, и мой мозг был месиво.

Я не могу мозг сегодня, у меня есть немой - остановка!

вот скрипку: http://jsfiddle.net/Y9Caw/

ответ

1

На самом деле, только удаление = $root.selectedUnitкажется делать то, что вы хотите:

value: $data.unit = $root.selectedUnit

http://jsfiddle.net/bman654/Y9Caw/2/

+0

Вы золотой Бог Brandon. У меня все еще есть способы пойти с пониманием безпараметрических расширений. Я не понимал, что просто добавление «value:» передаст переменную во все, что было бы дальше, если это возможно, и я создавал обходные пути, соответствующие моим нормальным шаблонам кодирования ... – Eirinn

+1

Эта строка привязки данных _just_ литерал объекта javascript, который вы вставляя кавычки в свой html с помощью javascript [с] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with), установленного в вашу модель просмотра. Это то же самое, как если бы вы написали его в javascript, например: 'with (viewmodel) {var x = {value: unit, text: amount}; ...} ... 'Как только вы это осознаете (и предположим, что знаете, что такое литерал объекта в JavaScript), становится легче понять синтаксис привязки данных. – Brandon

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