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

}

名前が「Perm_Collabs」であるClientDetailsと呼ばれるobservableArrayのインデックスから情報を取得し、その値を、DatabaseNameが「Collaberators」であるInputFieldsのCollabListと呼ばれるObservableArrayに渡します。今、私はこれをクロームで動作させています。他のブラウザは見た目と同じ速さで動作します。情報がajaxからのものであるため、現在非同期であるため、存在しないフィールドにデータを入れようとすると問題が発生する可能性があります。だから私はクロームでうまく機能するサブスクリプションでこれをやろうとしましたが、他にはありません。これに対する最善のアプローチは何ですか。いつものように、より多くの情報が必要な場合は質問してください!Calvinに感謝します。

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 に答える