2013-04-17 75 views
0

嗨我已經開始使用Knockout,因爲它爲我的目的更容易,然後jQuery。我之前使用過jQuery,但這使得我的代碼幾乎不可讀。有條件的viewmodel綁定

我有這個JavaScript的視圖模型

function ovm() { 
    this.delStreet = ko.observable(""); 
    this.deliveryNotSameAsInvoice = ko.observable(false); 
    this.invStreet = ko.observable(""); 
} 
ko.applyBindings(new ovm()); 

這個HTML:

<label><input type="checkbox" data-bind="checked: deliveryNotSameAsInvoice" />if your invoice address is not the same as delivery</label> 
<div id="delivery"> 
    <input type="text" placeholder="Street" 
     data-bind="value: delStreet, valueUpdate:'afterkeydown'" /> 
</div> 
<div id="invoice" data-bind="visible: deliveryNotSameAsInvoice"> 
    <input type="text" placeholder="Street" 
     data-bind="value: invStreet, valueUpdate:'afterkeydown'" /> 
</div> 
<hr/> 
Delivery street: <span data-bind="text: delStreet"></span><br/> 
Invoice street: <span data-bind="text: invStreet"></span><br/> 

的事情是,我想invStreet有delStreet的值,只要該複選框取消選中。我有一個working jsFiddle here ,並發現這SO question about conditional binding 但我找不到一個好的代碼示例。在jQuery中,我不得不將綁定事件綁定到每個文本框,並根據複選框是否被選中,我必須設置幾個字段。這是很多工作。特別是具有較大的「視圖模式」

+1

好像有人正在玩Knockout.js :) – 2013-04-18 15:57:58

回答

1

使用計算觀察到的,invStreet ..這樣

function ovm() { 
    var self = this; 
    this.delStreet = ko.observable(""); 
    this.deliveryNotSameAsInvoice = ko.observable(false); 
    this.invStreet = ko.observable(""); 
    var invStreetCheck = ko.computed(function(){ 
     var checked = self.deliveryNotSameAsInvoice(), 
      delStreet = self.delStreet(); 
     if(!checked) 
      return self.invStreet(delStreet); 
     return self.invStreet(); 
    }); 
} 

ko.applyBindings(new ovm()); 

現在,當檢查結合是真的,那將返回「」否則它將包含delStreet。值。

+0

謝謝我已經更新了jsFiddle http://jsfiddle.net/jphellemons/h4wn7/4/它幾乎工作。這是第一次。但是如果您改變主意並決定它是相同的地址,那麼當您取消選中該複選框時,它不會將發票地址設置爲與交貨相同。我有這樣的感覺,我早上缺乏咖啡因導致我無法在你的幫助下解決這個小問題:) –

+1

稍微更新了它..當你檢查複選框時你正在返回計算機本身。這是行不通的。我創建了一個計算可觀察值,只是爲了修改invCheck的值。看一看。 http://jsfiddle.net/sujesharukil/h4wn7/7/ –