0
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

}

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

4

1 回答 1

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;
}
于 2013-01-04T20:41:46.430 回答