Knockout JS并在textInput更改时执行$ .ajax

时间:2017-11-04 18:23:42

标签: javascript jquery ajax knockout.js

我有一个动态生成的表,基于从数据库中检索的数据,因此我来自数据库的对象列表如下所示:

public string Account { get; set; }
public string Description { get; set; }
public decimal A2Year { get; set; }
public decimal A1Year { get; set; }
public decimal B1Year { get; set; }
public decimal Current { get; set; }
public decimal Proposed { get; set; }
public IEnumerable<CustomerInfo> UserSalaries { get; set; }

我使用$ .ajax get函数检索此数据,因为它是一个列表,我按以下方式生成表:

<tbody data-bind="foreach: accountData">
    <tr class="dept-row" role="row">
        <td><span data-bind="text: Description"></span></td>
        <td><span data-bind="text: Account"></span></td>
        <td class="center-text"><a data-bind="click: function(){ $parent.showNoteDialog(Account)}"></a></td>
        <td class="align-right"><span data-bind="text: A2Year"></span></td>
        <td class="align-right"><span data-bind="text: B1Year"></span></td>
        <td class="align-right"><span data-bind="text: A1Year"></span></td>
        <td class="align-right"><span data-bind="text: Current"></span></td>
        <td><input class="align-right dollar-amount" data-bind="textInput: Proposed" /></td>
    </tr>
</tbody>

表格是正确生成的,在我的视图模型中,我只有以下行:

self.accountData = ko.observableArray();

我想要实现的目标,我是KnockoutJS的新手,当时是&#34;提议&#34;输入值更改,我想调用$ .ajax函数将此值保存到数据库中。我已阅读并尝试使用绑定&#34; hasFocus&#34;所以我可以在离开字段时调用ajax,但是如果我添加hasFocus绑定,我无法生成表,因为那时所有输入字段都具有完全相同的绑定。任何建议如何实现这一目标?建议的值应该在其自己的可观察数组中,还是跟踪整个对象列表是否足够好?最终的问题是如何在数据更改时调用ajax函数来保存数据。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您有以下要求:

  1. 您希望在Proposed的值更改时调用ajax函数。
  2. 您希望在值更改时调用ajax函数,并且仅当Proposed的输入字段失去焦点时才会调用。
  3. 正确?

    在这种情况下,您需要进行以下更改:

    1. 更改Proposed与&#39; textInput&#39;的数据绑定与data-bind="value: Proposed"中的价值相同。
    2. 仅当Proposed本身是可观察的时,绑定才有效。实际上,您的所有值都需要是可观察的 IF 它们将会发生变化,您需要动态地在UI中反映这些变化。您可以在observables数组中使用observable。
    3. 要在Proposed的值发生变化时调用ajax函数,您需要订阅&#39;为此,你可以倾听它的变化。
    4. 基本方法 - 使用subscribe功能:

      self.Proposed.subscribe(function(newValue){
          //call ajax
      });
      

      高级,更有条理的方式 - 使用extenders