Jquery 使用异步ajax时,从不同模型传递信息
我想从名为“Perm_Collabors”的ObservalArray中的一个名为ClientDetails的索引中获取信息,并将该索引中的值传递给数据库名为“Collaberators”的InputFields中名为CollabList的ObservalArray。现在,我在chrome浏览器和其他浏览器arnt中都能很快地完成这项工作。我可能在尝试将数据放入不存在的字段时遇到问题,因为信息来自ajax,因此当前是异步的。所以我尝试用一个在chrome上运行良好的订阅来实现这一点,而不是在其他任何地方。最好的方法是什么。一如既往,如果您需要更多信息,请咨询!谢谢Calvin。好的,有几件事可以帮助您解决跨浏览器问题 首先,这条线Jquery 使用异步ajax时,从不同模型传递信息,jquery,ajax,knockout.js,knockout-2.0,Jquery,Ajax,Knockout.js,Knockout 2.0,我想从名为“Perm_Collabors”的ObservalArray中的一个名为ClientDetails的索引中获取信息,并将该索引中的值传递给数据库名为“Collaberators”的InputFields中名为CollabList的ObservalArray。现在,我在chrome浏览器和其他浏览器arnt中都能很快地完成这项工作。我可能在尝试将数据放入不存在的字段时遇到问题,因为信息来自ajax,因此当前是异步的。所以我尝试用一个在chrome上运行良好的订阅来实现这一点,而不是在其他
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
}
您是否正在检查DatabaseName是否未定义?其次,您没有得到DatabaseName的可观察值,只是得到函数。你可能想要这个:
this.DatabaseName.CollabList = ko.observableArray([]);
第二,手工订阅。有时,特别是异步加载数据时,您不希望在Y完成更新之前更新X变量。比如说
this.DatabaseName().CollabList = ko.observableArray([]);
关于从ClientDetails获取信息,假设所有变量都已正确连接,则只需对每个变量执行foreach
this.myObservableArray = ko.observableArray([]);
this.myObservableArray.subscribe(function(newValueOfMyObservableArray) {
$.ajax({..., success: function(data) {
this.mySecondObservableArray(data);
}})
}, this);
谢谢你花时间回答我的问题。
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;
}