2

階層ビューモデルを使用したノックアウトjsとマッピングプラグインに問題があります

私のビューモデルは次のように構成されています。

VM = {
    members:[
        {
            name:"name 1",
            volunteering:[{...},{...},{...}]
        },
        {
            name:"name 1",
            volunteering:[{...},{...},{...}]
        }
    ]
}

各メンバーはタブ内にあり、各タブにはボランティア活動のグリッドがあります。グリッド内の項目をクリックすると、ボランティア活動を編集するためのダイアログボックスがポップアップ表示されます。この時点で、「編集のキャンセル」機能を容易にするためにオブジェクトのクローンを作成します

var Volunteer = {};
var koContext=ko.contextFor(this);
Volunteer = ko.mapping.toJS(koContext.$data);  //plain js volunteer
Volunteer.index=koContext.$parent.EventVolunteers().indexOf(koContext.$data);  //index of volunteer in member volunteer array
ko.applyBindings(ko.mapping.fromJS(Volunteer),$("#dialog-EditVolunteer")[0]); //bind new volunteer obj to dialog

この時点までは問題ないようですが、ダイアログで[保存]をクリックすると問題が発生します。

var volunteer = ko.mapping.toJS(ko.contextFor(this).$data);
ko.mapping.fromJS(volunteer,{},ko.contextFor(currentTab).$data.EventVolunteers()[volunteer.index]);

この時点で、プロパティはビューモデルで更新されますが、メイン画面のグリッドでは更新されません。

ko.mapping.fromJSがオブザーバブルを更新するのではなく置き換えているようです。

4

3 に答える 3

0

個人的には、このようなモデルを作成するのが好きです。ここでの抽象化は、より理にかなっています。

function VolunteerInfo(data){
  var self = this;
  self.activitiesName = ko.observable(data.name);
  // any other info not all of it has to be mapped 
  // unless you plan on sending it back.
}
function MembersInfo(data){
  var self = this;
  self.name = ko.observable(data.name)// w.e it is labeled as under json
  self.volunteering = ko.observableArray([]);
  var mappedVolunteers = $.map(data.volunterring, function(item){
    var volunteer = new VolunteerInfo(item);
    return volunteer;
  });
  self.volunterring(mappedVolunteers);
}
function VM(){
  var self = this;
  self.members = ko.o
  var request = $.getJSON("webservice address");
  request.done(function () {
    var mappedMembers = $.map(data.volunterring, function(item){
      var member = new MemberInfo(item);
      return member;
    });
    self.members(mappedMembers);
  }
}
// apply bindings to VM ect ect.
于 2013-01-17T20:38:56.670 に答える
0

この場合の私の最終的な解決策は、「複製された」ビューモデルから編集された値を使用して、元の VM のプロパティを設定することでした。

ただし、新しいプロジェクトでは、ノックアウト プラグインを使用するようになりました

于 2013-06-24T13:50:29.313 に答える
0

私はあなたが何をしているのかを完全に理解しているかどうか確信が持てません。

しかし、アイテムのリストで元に戻す機能を実行しようとしていて、これを配列で使用しました:

observableArray.replace(newData, ko.mapping.fromJS(original))

クリック ハンドラの引数として新しいデータを取得します。

オリジナルを保存するとき、私は基本的にこれを持っています:

        //Dupe check
        self.undoCache.Emails.pop(jQuery.grep(self.undoCache.Emails, function (element, index) { return element.Id == data.Id(); })[0]);
        //Store original
        self.undoCache.Emails.push(ko.mapping.toJS(data));

「メール」は私が編集しているオブジェクトです。観測可能データではなく、元のデータのみを保存します。これにより、置換を使用できました。それ自体がどれほど正しいかはわかりませんが、キャンセルはうまくいきます。

于 2013-02-22T02:45:17.547 に答える