【问题标题】:Knockout passing information from different models when using async ajax使用异步 ajax 时从不同模型中剔除传递信息
【发布时间】:2012-12-19 07:29:45
【问题描述】:
function UserInformation(data) {
    var self = this;
    this.AddressDetails = ko.observable(data.AddressDetails)
    // Client Details is array of ClientDetailInfo
    this.ClientDetails = ko.observableArray(data.ClientDetails);
    this.UserID = ko.observable(data.UserID);
}
function ClientDetailInfo(data) {
  this.Name = ko.observable(data.Name);
  this.Value = ko.observable(data.Value);
}
function InputFieldInfo(data) {
  this.DatabaseName = ko.observable(data.DatabaseName);
  this.Value = ko.observable(data.Value);
  // collab list gets filled when a user adds collaborators from the ui
  this.DatabaseName.CollabList = ko.observableArray([]);
}
function ViewModel() {
  var self = this;
  this.Name = ko.observable("");
  this.InputFields = ko.observable([]);

  //ajax request that maps data to InputFields

  //ajax request that maps data to User

}

我想从 observableArray 中名为 ClientDetails 的索引中获取信息,其中名称为“Perm_Collabs”,并将值传递给 InputFields 中名为 CollabList 的 ObservableArray,其中 DatabaseName 为“Collaberators”。现在我有这个在 chrome 中工作,其他浏览器的运行速度和看起来一样快我可能在尝试将数据放在不存在的字段中时遇到问题,因为信息来自 ajax,因此当前是异步的。因此,我尝试通过订阅来做到这一点,该订阅在 chrome 中运行良好,在其他任何地方都没有。什么是最好的方法。一如既往,如果您需要更多信息,请询问!谢谢卡尔文。

【问题讨论】:

    标签: jquery ajax knockout.js knockout-2.0


    【解决方案1】:

    好的,有几件事可以帮助您解决跨浏览器问题。

    首先,这一行。

    this.DatabaseName.CollabList = ko.observableArray([]);
    

    您是否在检查 DatabaseName 是否为 undefined?其次,您没有得到 DatabaseName 的可观察值,而只是函数。你可能想要这个:

    this.DatabaseName().CollabList = ko.observableArray([]); 
    

    第二,手动订阅。有时,特别是在异步加载数据时,您不希望在 Y 完成更新之前更新 X 变量。比如

    this.myObservableArray = ko.observableArray([]);
    this.myObservableArray.subscribe(function(newValueOfMyObservableArray) {
          $.ajax({..., success: function(data) {
             this.mySecondObservableArray(data);
          }})
    }, this);
    

    关于从ClientDetails获取信息,你只需要做一个foreach,假设你正确连接了所有变量。

    function transferData(clientDetails, inputFields) {
    var localClient = {};
    ko.utils.arrayForEach(clientDetails(), function(client) {
        if (client.name === "Perm_Collabs") localClient = client;
    });
    
    ko.utils.arrayForEach(inputFields(), function(field) {
        if (field.databaseName === "Collaberators") {
            //Do whatever with localClient
        }
    });
    
    // Or if you need to replace in the same index you can skip the second loop
    var index = clientDetails.indexOf(localClient); // Or do a forloop and save this step;
    inputfields()[index].client = client;
    }
    

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2011-08-27
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多