2014-09-12 55 views
2

以我的ViewModel,main.PlansOptions计划正被正确地与3个计划对象初始化一个数组。当用户点击一个按钮时,我想复制所选计划的参考文件到main.SelectedPlan observable。复制对象引用另一个可观察到的

的问题是,在ChoosePlan功能,之后我复制到selectedplan main.SelectedPlan,计划对象的布尔值(UnlimitedFencesShowAdvertisings失去了原有的值(从假为真)

我试图让main.SelectedPlan计算出来,并得到一个名为main.SelectedPlanIndex的索引的选定计划,但同样的错误发生。我相信如何将一个对象(具有可观察属性)复制到另一个可观察对象上有一个正确的方法。

任何帮助,将不胜感激


计划的定义

function Plan(id, name, monitors, commands, historydays, unlimitedfences, supporttype, showadvertisings) { 
    var o = this; 

    o.PlanId = ko.observable(id); 
    o.Name = ko.observable(name); 
    o.Monitors = ko.observable(monitors); 
    o.Commands = ko.observable(commands); 
    o.HistoryDays = ko.observable(historydays); 
    o.UnlimitedFences = ko.observable(unlimitedfences); // boolean 
    o.SupportType = ko.observable(supporttype); 
    o.ShowAdvertisings = ko.observable(showadvertisings); // boolean 
}; 

视图模型

function PurchasePlanViewModel() { 

    var main = this; 

    main.PlansOptions = ko.observableArray([]); 
    main.SelectedPlanIndex = ko.observable(-1); 
    main.SelectedPlan = ko.observable(); 

    ... 

    // Sub View Model (inside of PurchasePlanViewModel) 
    main.SelectPlan = new function() { 
     var o = this; 

     o.ChoosePlan = function (selectedplan) { 
      // the problem occurs here -- booleans of selectedplan are set to true 
      main.SelectedPlan(selectedplan); 
     } 

     ... 
    } 

HTML

<section class="select-plan" data-bind="with: SelectPlan, visible: ShowSelectPlan"> 
    <div class="plans-options hidden-xs clearfix" data-bind="foreach: $root.PlansOptions"> 
     <div class="plan-option col-sm-4" data-bind="css: { selected : $root.SelectedPlan() ? PlanId() == $root.SelectedPlan().PlanId() : false }"> 
      <h4 class="plan-title" data-bind="text: Name"></h4> 
      <div class="plan-info"> 
       <div class="vehicular-price"> 
        <span class="price" data-bind="text: VehicularTrackerUnitCost.AsCurrency()"></span> 

      ... 

      <div class="purchase"> 
       <button class="btn btn-block btn-success" data-bind="click: $parent.ChoosePlan" style="margin-top: 10px;">Quero o <span data-bind="text: Name"></span></button> 
      </div> 
     </div><!-- end of plan-info --> 
    </div><!-- end of plan-option --> 
</div><!-- end of plans-options --> 
+2

您可以创建带有问题的简单JSFiddle演示吗? – Ilya 2014-09-15 12:47:40

+0

“PlansOptions”中的原始“计划”是否也发生了变化? – haim770 2014-09-15 12:55:55

+0

是的,当o.ChoosePlan被调用并且main.SelectedPlan()被selectplan初始化时,UnlimitedFences和ShowAdvertisings(的selectedplan)的值将在PlansOptions()可观察数组中从false更改为true – 2014-09-15 13:01:58

回答

2

您将PlanPlans复制到SelectedPlan,然后您在原始对象中更改了UnlimitedFencesShowAdvertisings
UnlimitedFencesShowAdvertisings在两个对象中都被改变是完全正确的!
我认为你的模型是不正确的。我可以提出另一种模式:

function Plan(id, name, monitors, commands, historydays, unlimitedfences, supporttype, showadvertisings) { 
    var o = this; 

    o.PlanId = ko.observable(id); 
    o.Name = ko.observable(name); 
    o.Monitors = ko.observable(monitors); 
    o.Commands = ko.observable(commands); 
    o.HistoryDays = ko.observable(historydays); 
    o.SupportType = ko.observable(supporttype); 

}; 

function PlanHolder(plan, unlimitedfences, showadvertisings) 
{ 
    var o = this; 
    o.UnlimitedFences = ko.observable(unlimitedfences); // boolean 
    o.ShowAdvertisings = ko.observable(showadvertisings); // boolean 
    o.Plan = plan; 
    o.clone = function() 
    { 
     return new PlanHolder(o.Plan, o.UnlimitedFences(), o.ShowAdvertisings()); 
    } 
} 

现在,您应该保存的PlanHolderobservableArray s,而不是Plan。你应该克隆PlanHolder之前应付SelectedPlan

JSFiddle DEMO与您的模型。 unlimitedfences更改为true选择两个对象后
JSFiddle DEMOPlanHolderunlimitedfences更改为true只能在原始对象中

相关问题