2017-11-30 6 views
0

ユーザーが単一項目をクリックするたびに一度にすべてのデータを保存する必要があります。そのため私はそれぞれのプロパティに対してsubscribe()を使用しました。 私の場合は、ApplyContting()メソッドをモデル関数の中から呼び出す必要があります。配列を埋めるたびにListを渡すのは良い考えだとは思わない。私にはたくさんのデータがあるからです。あなたはこれがko.pureComputedのための理想的なユースケースでくださいノックアウトバインディングを使用してモデルクラスからViewModalメソッドを呼び出す必要があります

function UserViewModel(data) { 
 
    var self = this; 
 
    self.userID = data.userID; 
 
    
 
    self.userroles = ko.observableArray(); 
 
    self.userroles.removeAll(); 
 
    
 
    data.forEach(function(item) { 
 
    self.userroles.push(new UserRoleModal(item)); 
 
    }); 
 

 
    self.ApplySetting(data) { 
 
    //Ajax POST method to send List to server 
 
    } 
 
} 
 

 
function UserRoleModal(item) { 
 
    var self = this; 
 
    
 
    self.userID = ko.observable(item.Id); 
 
    self.CanEdit = ko.observable(item.CanEdit); 
 
    self.CanDelete = ko.observable(item.CanDelete); 
 
    self.canView = ko.observable(item.canView); 
 
    self.FullControl = ko.observable(item.FullControl); 
 

 
    self.canView.subscribe(function(newValue) { 
 
    // need to call ApplySetting method and pass List 
 
    }); 
 
    
 
}
<table class="table table-hover"> 
 
    <thead> 
 
    <tr> 
 
     <th class="panel-body text-center"> CanEdit</th> 
 
     <th class="panel-body text-center"> CanDelete</th> 
 
     <th class="panel-body text-center"> canView</th> 
 
     <th class="panel-body text-center"> FullControl</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody data-bind="foreach:userroles"> 
 
    <tr> 
 
     <td class="panel-body text-center"><input type="checkbox" data-bind='checked: CanDelete' /></td> 
 
     <td class="panel-body text-center"><input type="checkbox" data-bind='checked: canView' /></td> 
 
     <td class="panel-body text-center"><input type="checkbox" data-bind='checked: FullControl' /></td> 
 
    </tr> 
 
    </tbody> 
 
</table>

答えて

1

これを行うための任意の最善の方法がありますが、私に言うだろう。ノックアウトの計算値は、独自の依存関係追跡を管理します。すなわち:観察可能な値を使用することにより、あなたは自動的にすべての変更に加入している:

function UserRoleModal(item) { 
    /* ... */ 

    self.viewOptions = ko.pureComputed(function() { 
    return { 
     canEdit: self.CanEdit(), 
     canDelete: self.CanDelete(), 
     canView: self.canView() 
     fullControl: self.FullControl() 
    }; 
    }); 

}; 

このプロパティは、サブスクライブ中にあなたUserRoleModalの状態のプレーンなオブジェクト表現になります。

function UserViewModel(data) { 
    /* ... */ 

    var userRoleSettings = ko.pureComputed(function() { 
    return self.userroles().map(function(role) { 
    return role.viewOptions(); 
    }); 
    }).extend({ deferred: true });  

    userRoleSettings.subscribe(function applySetting(latestSettings) { 
    //Ajax POST method to send List to server 
    }); 
} 

が要約:これは、あなたが親ビューモデル内のすべてのロールを収集し、更新情報を投稿する購読することができることを意味し

  • たびRoleModal許可プロパティが変更され、viewOptionsアップデート
  • たびviewOptionsプロパティの変更、userRoleSettings更新
  • userRoleSettingsが更新されるたびに、最新のvalでapplySettingsが呼び出されますue
+0

素晴らしい!!!私はそれを理解して実装することができました。非常に役立ちます。ありがとう:) – Chanet

+0

私はサーバーに単一のアイテムを送信する必要がある場合、私は同じアプローチを使用して送信する方法を教えてください? – Chanet

関連する問題