单击按钮可观察值在敲除js中没有变化

时间:2014-05-22 06:22:23

标签: knockout.js

我有一个对象Address。地址中包含streetcountrystateIsDefault等字段。地址可以是多个,IsDefault将是无线电 按钮。

   $.each(self.Addresses(), function (index, address) {  
        address.Street = ko.observable(adderss.Street);         
        address.State = ko.observable(address.State);
        address.Country = ko.observable(address.Country);
        address.IsDefault = ko.observable(address.IsDefault.toString());
        address.IsGlobalCheckbox = ko.computed({
            read: function () {
                return address.IsDefault() + "";
            },
            write: function (v) {                   
                if (v == "true") {
                    address.IsDefault(true)
                }
                else {
                    address.IsDefault(false)
                }
            }
        });
    });

Html内容将是

    <div data-bind="foreach: Addresses">
<div>
    Address <span data-bind="text: ($index() + 1)" class="mrl"></span>


    <input name="contactAddress" type="radio" data-bind="checked:IsGlobalCheckbox,attr: { value:IsDefault }" />

    <span>Primary</span>



<div data-bind="attr:{id:'address'+($index() + 1)}" class="in">
    <div class="row">            
        <div class="form-group">
            <label>Street 1</label>
            <input type="text" data-bind="value: Street" />
        </div>
    </div>
    <div>           
        <div class="form-group medium">
            <label >Country</label>
            <input data-bind="value:Country" />
        </div>
        <div class="form-group medium">
            <label>State</label>
            <input type="text" data-bind="value:State" />
        </div>
    </div>
</div>

当我更改一个默认地址时,它正在改变,但剩下的是默认的可观察数据没有改变。希望你理解我的问题。

我附上一个小提琴,在小提琴中解释我的要求http://jsfiddle.net/Naidu526/fzX8C/2/

当我将IsDefault从一个字段更改为另一个字段时,其他可观察值不会改变。请检查下面显示的json格式

1 个答案:

答案 0 :(得分:1)

问题在于,您永远不会清除/伪造之前选择的Address状态,也无法访问该值。

使用和复制(请参阅IsGlobalCheckbox)每个IsDefaultAddress的值没有多大意义。如果只能选择1并且要将状态传达给所有其他状态,则该上下文属于Address模型的上方/外部。即使是当前的命名也表明它不属于那里。

因此,在$root / $parent中定义一个新的observable,具体取决于要存储Primary Address的生产模型的整体结构。

 self.primaryAddress = ko.observable();

更改html绑定以使用checkValue绑定的checked参数,以便实际Address存储在模型中。

 <input name="contactAddress" type="radio" data-bind="checked:$root.primaryAddress, checkedValue: $data" /> <span>Primary</span>

现在我们有适当的设置来“监听”更改并相应地修改IsDefault

有两种选择:

  1. 通过primaryAddress
  2. 上的2个订阅手动管理值
  3. IsDefault转换为依赖于primaryAddress
  4. 的计算观察值

    我喜欢选项#2。

    address.IsDefault = ko.computed(function(){
      return address === self.primaryAddress()
    });
    

    请确保包含初始化:

     if(address.IsDefault == "true"){          
       self.primaryAddress(address)
     }
    

    有关完整设置,请参阅my fiddle。我还在注释掉的代码中包含选项#1作为参考。