2012-11-27 3 views
4

현재 프로젝트에서 녹아웃을 시도하기로 결정했으며 다음과 같은 작업이 가능한지 궁금합니다. 몇 가지 기본 목록 조작을위한 인트라넷 앱을 작성하고 있습니다. 응용 프로그램은 AJAX를 통해 MVC 컨트롤러에서 데이터를 가져옵니다. 다음과 같이KnockoutJS : observableArray 항목의 내부 observable을 구독하십시오.

function showData(data) { // ajax callback 
    $.each(data, function (key, dmsEntry) { 
     vm.listToShow.push(new dmsList(dmsEntry)); // adds new dmsEntry into observableArray 
    }); 
} 

dmsList 기능은 같습니다 다음과 같이 내 콜백 함수에서 나는 관측 배열에 항목을 작성하고있어

function dmsList(dmsEntry) { 
     return { 
      a: dmsEntry.a, 
      b: dmsEntry.b, 
      active: ko.observable(false) 
     } 
} 

때 사용자 true로 변경됩니다 관찰 "활성" 목록 항목을 표시합니다. 그래서 내 질문은 :

그래서 "활성"관측에 가입 할 수 있는지 궁금하네요? 따라서 사용자가 항목을 표시 할 때마다 사용자 지정 함수가 호출되고 항목이 "markedEntries"관찰 가능 배열로 푸시됩니까?

는 이미와 기능을 구현했습니다 :

<input type="checkbox" data-bind="checked: active, click: $root.addToActionQueue" /> 

하지만 내가 다른 방법으로 "표시"항목을 가지고있는 다른 방법이 훨씬 청소기 해결책이 될 것이라고 생각합니다.

답변

5

markedEntries 배열을 활성 관찰 가능 항목으로 필터링 된 목록 배열을 반환하는 computed으로 만드십시오. 항목의 활성 상태가 변경 될 때마다 업데이트됩니다. ,

function showData(data) { //ajax callback 
    var list = []; 
    $.each(data, function (key, dmsEntry) { 
     list.push(new dmsList(dmsEntry); //adds new dmsEntry in observableArray   
    }); 
    vm.listToShow(list); 
} 
+0

큰 매력 타이처럼 작동 :

var markedEntries = ko.computed(function() { return ko.utils.arrayFilter(this.items(), function(item) { return item.active(); }); }); 

또한, 가정 listToShow는 다음과 같이 한 번에 그 값을 설정해야 observable array입니다! 그리고 관찰 가능한 배열 값을 한꺼번에 설정하는 것은 완전히 이해가됩니다. – opp

관련 문제