javascript - knockout 确定下拉列表选择并将文本更新到数据库

标签 javascript knockout.js

我正在努力绑定(bind)从数据库检索的一些数据,然后将其更新回数据库。在这种情况下,数据库表有点奇怪,但我得到指示不要修改现有数据库。

事情的工作原理如下: 数据库表中同时包含GoldMemberCardNo和SilverMemberCardNo,其中一次只填充其中一个(另一个为空)。

我需要根据是否为空来确定成员(member)是 GoldMemberCardHolder 还是 SilverMemberCardHolder,并将正确的成员(member)(成员(member)类别和金/银卡号)绑定(bind)到初始页面加载时的下拉列表和文本输入。 区分成员(member)是金卡成员(member)还是银卡成员(member)的唯一方法就是查看该成员(member)的卡号是否填写

然后,管理员有权从选择中进行选择并根据需要输入卡号,然后提交表单。

假设用户之前是银卡成员(member)卡,现在需要变更为金卡成员(member)卡。管理员填写所需信息后,更新时,银卡成员(member)卡将被设置为空,金卡成员(member)卡值将更新到数据库中。

我已尝试如下,但卡在这里。由于它是计算可观察的,因此 ko.observable 将始终相同,并且当值发生变化时不会监听变化。因此,后值始终是初始值。而且我认为我的解决方案方法相当臃肿。

function MemberProfile() {
  var self = this;
  self.SilverMemberCardNo = ko.observable();
  self.GoldMemberCardNo = ko.observable(); 
  self.CardNo = ko.observable();
  self.MemberCategory = ko.computed(function() {
      if(self.SilverMemberCardNo() != null) {
        return "0";
      else if(self.GoldMemberCardNo() != null) {
        return "1";
      }
  });
   self.CardNo = ko.computed(function() {
      if(self.SilverMemberCardNo() != null) {
        return self.SilverMemberCardNo();
      else if(self.GoldMemberCardNo() != null) {
        return self.GoldMemberCardNo();
      }
  });
  
  self.GetMemberProfile() = function() {
    $.ajax({
      dataType: 'json',
      type: 'GET',
      url: ...,
      success: {
          ko.mapping.fromJS(data, {}, self);
      }
    })
  }
  
  self.UpdateMemberProfile() = function() {
    if(self.MemberCategory == "0") {
      self.SilverMemberCardNo(self.CardNo);
      self.GoldMemberCardNo(null)
    }
    else if (self.MemberCategory == "1") {
       self.SilverMemberCardNo(null);
       self.GoldMemberCardNo(self.CardNo)
    }
    $.ajax({
      dataType: 'json',
      type: 'PUT',
      url: ...,
      data: {
           SilverMemberCardNo: self.SilverMemberCardNo,
           GoldMemberCardNo: self.GoldMemberCardNo
           ......
      }
  }
}

ko.applyBindings(new MemberProfile());

// Data return from JSON
{
  "SilverMemberCardNo": null
  "GoldMemberCardNo": "123456789"
  ....
  ....
  ....
}
<select>
  <option value="0" text="Silver Member" data-bind="value:MemberCategory"></option>
  <option value="1" text="Gold Member" data-bind="value:MemberCategory"></option>
</select>

<input type="text" data-bind="CardNo" />

最佳答案

您可以将 MemberCategory 设为一个简单的可观察对象,并使用 self.GetMemberProfile() 成功事件函数中的逻辑设置其值。

function MemberProfile() {
  var self = this;

  self.CardNo = ko.observable();
  self.MemberCategory = ko.observable();

  self.GetMemberProfile() = function() {
    $.ajax({
      dataType: 'json',
      type: 'GET',
      url: ...,
      success: {
          ko.mapping.fromJS(data, {}, self);

          if (self.SilverMemberCardNo() != null) {
              self.MemberCategory("0");
          } else if (self.GoldMemberCardNo() != null) {
              self.MemberCategory("1");
          }
      }
    })
  }

  self.UpdateMemberProfile() = function() {
    var silverMemberCardNo;
    var goldMemberCardNo;

    if (self.MemberCategory == "0") {
        silverMemberCardNo = self.CardNo();
        goldMemberCardNo = null;
    } else if (self.MemberCategory == "1") {
        silverMemberCardNo = null;
        goldMemberCardNo = self.CardNo();
    }

    $.ajax({
      dataType: 'json',
      type: 'PUT',
      url: ...,
      data: {
           SilverMemberCardNo: silverMemberCardNo,
           GoldMemberCardNo: goldMemberCardNo
      }
  }
}

要考虑的另一件事(您可能无法控制)是,此逻辑在服务器上执行比在客户端上执行更安全。这意味着取出 JavaScript 中的所有逻辑并在服务器上执行。让客户端只需要呈现数据并将其发回。

关于javascript - knockout 确定下拉列表选择并将文本更新到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32403581/

相关文章:

javascript - 使用生成器/迭代器包装结果集回调函数

javascript - jquery水流过管道效果

javascript - 对 knockout js 中的 &lt;!-- ko if : $parent. name == name --> 感到困惑

javascript - 在 Knockout.js 中删除数据后刷新 ViewModel

javascript - knockout 验证未通过 knockout 自定义绑定(bind)触发

javascript - meteor JS : How to use Spacebars to display contents inside an array retrieved from Meteor Collection

javascript - Angular 媒体播放器和动态内容

knockout.js - knockoutjs - 选择更改事件不会第一次触发

javascript - 如何将多个值传递给 Angularjs 指令?

javascript - knockout 设置下拉值