2017-11-30 9 views
0

사용자가 단일 항목을 클릭 할 때마다 전체 데이터를 한 번에 저장해야합니다. 그 때문에 각 속성에 대해 subscribe()을 사용했습니다. 하지만 제 경우에는 모델 내부 함수에서 부모 Apply30ting() 메서드를 호출해야합니다. 배열을 채울 때마다 List를 전달하는 것이 좋습니다. 나는 많은 수의 데이터를 가지고 있기 때문에. 당신이 나에게 말할 것,녹아웃 바인딩을 사용하여 모델 클래스에서 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

이것은 ko.pureComputed을위한 이상적인 사용 사례입니다이 제발 할 수있는 최선의 방법이있다. 녹아웃의 계산 된 값은 자체 종속성 추적을 관리합니다. 즉 : 관측 값을 사용하여 자동 변경에 가입 :

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 업데이트가있을 때마다 applySettings이 최신 val로 호출됩니다. ue
+0

멋진 !!! 잘 설명하고 그것을 이해하고 구현할 수있었습니다. 매우 도움이됩니다. 고마워요 :) – Chanet

+0

또한 서버에 단일 항목을 보낼 필요가 있다면 어떻게 말해도 동일한 접근 방식을 사용하여 보낼 수 있습니까? – Chanet