2016-12-09 139 views
0

我有一个可观察到的阵列AllItems定义为制作淘汰赛可观察到的数组属性可观察

var ViewModel = function() { 
    var self = this; 
    self.AllItems = ko.observableArray([]); 
} 

它得到由数据从一个AJAX调用填充和我刚添加从Ajax调用直接接收到阵列的属性,而无需限定他们。

我在下面的HTML中使用它来填充表格。

var ViewModel = function() { 
 
    var self = this; 
 
    self.AllItems = ko.observableArray([]); 
 
} 
 
$(document).ready(function() { 
 
    ko.applyBindings(new ViewModel()); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script> 
 
<table> 
 
    <tbody data-bind="foreach: AllItems"> 
 
    <td> 
 
     <span>$</span><span data-bind="text: $data.RequestedPrice"></span> 
 
    </td> 
 

 
    <!-- ko ifnot: (Number(RequestedPrice) > Number(ItemDetails.SmPrice)) --> 
 
    <input type="button" disabled value="Approve" id="Approved" data-bind="click: $root.ApproveItem" style="background-color:#e1eae5 !important" /> 
 
    <!-- /ko --> 
 
    <!-- ko ifnot: (Number(RequestedPrice) > Number(ItemDetails.SmPrice)) --> 
 
    <input type="button" disabled value="Approve" id="Approved" data-bind="click: $root.ApproveItem" style="background-color:#e1eae5 !important" /> 
 
    <!-- /ko --> 
 

 
    <nobr>$ 
 
     <input type="text" class="priceChange" onkeypress="return isNumberKey(event)" style="display:inline !important" data-bind="value: $data.RequestedPrice" /> 
 
    </nobr> 
 
    </tbody> 
 
</table>

因此,我已在上述HTML三件事情。首先,我只是显示请求价格的文本。第二我用它来禁用一个按钮,第三我使它成为一个可编辑的领域。

问题是,当我更改该值时,它不反映在文本中,也没有更新用于禁用按钮的第二种情况。有人能告诉我我需要做什么吗?

+0

请添加您在HTML中绑定中使用的所有viewmodel部件。还添加模拟数据。 – connexo

+2

为什么你有两次完全相同的按钮?另外,修正你的HTML结构,它是完全无效的。 – Tomalak

回答

0

三个选项:

  • 写您的js自定义映射关系(上)从后端给有可观察的属性的对象来;
  • 使用ko.mapping;
  • 使用knockout.es5与一些自定义代码;

与Angular1相反,Knockout要求你默认明确你想要观察哪些东西(当使用ko.mapping时你明确地说所有东西都是可观察的)。