2017-04-13 3 views
0

ASP.NET MVC 프로젝트에서 bootstrap dual listbox pluging을 사용하고 있습니다.
프로젝트에서 녹아웃도 사용하고 있습니다. 나는 녹아웃으로 원활하게 작동하도록이 플러그인에 대해 bindingHandler을 만들려고합니다. 여기 부트 스트랩 이중 목록 상자 녹아웃 바인딩

내가

는 HTML

<select class="form-control" data-bind="foreach:{data: EditedElement().Operations, as : 'op'} , dualList: EditedElement().Operations" multiple> 
    <option data-bind="value: op.OperationID(), text: op.Name(), selected: op.IsSelected()"></option> 
</select> 

보기 모델

0 처리기

ko.bindingHandlers.dualList = { 
    init: function (element, valueAccessor) { 
     $(element).bootstrapDualListbox({ 
      selectorMinimalHeight: 160 
     }); 

     $(element).on('change', function() { 
      $(element).bootstrapDualListbox('refresh', true); 
     }); 

     ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
      $(element).bootstrapDualListbox('destroy'); 
     }); 
    }, 
    update: function (element, valueAccessor) { 
     $(element).bootstrapDualListbox('refresh', true); 
    } 
} 

바인딩 뭘하려

내 문제는이며 viewModel observableArray과 플러그인간에 동기화 할 수 없습니다. 즉, 뷰 모델 속성에 반영되도록 플러그인의 변경 사항 (사용자가 일부 옵션을 제거하거나 옵션을 추가 함)을 사용하려면

답변

2

을 동기화하려면 여러 관측 값을 사용자 정의

을 결합하는 것은 그래서 당신의 HTML은

ko.bindingHandlers.dualList = { 
    init: function(element, valueAccessor) { 
    var data = ko.utils.unwrapObservable(valueAccessor()); 
    $(element).bootstrapDualListbox({ 
     selectorMinimalHeight: 160 
    }); 

    $(element).on('change', function() { 
     // save selected to an observable 
     data.selected($(element).val());; 
    }); 

    ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
     $(element).bootstrapDualListbox('destroy'); 
    }); 
    }, 
    update: function(element, valueAccessor) { 
    // to view if there is an update (without this "update" will not fire) 
    var options = ko.utils.unwrapObservable(valueAccessor()).options(); 
    $(element).bootstrapDualListbox('refresh', true); 
    } 
} 

또한 전 C가처럼 사용자 정의

<select class="form-control" data-bind="foreach: { data: Operations, as: 'op'}, dualList: { options: Operations, selected: Selected }" multiple> 
    <option data-bind="value: op.OperationID(), text: op.Name(), selected: op.IsSelected()"></option> 
</select> 

및 바인딩처럼해야한다 더러운 작업을 reated jsfiddle

+0

그것은 도움이 될 것 같은데, 그 확인하고 그 수락에 따라 답변을 수락 것입니다. 덕분에 당신의 시간에 대한 어떤 식 으로든 –

+0

'selected' observable은'바인딩 처리기 (binding handler) '외부에서 쿼리 할 때'undefined'라고 생각할 수 있습니다. 그 원인을 알 수 있습니까? –

+0

대단히 고마워,이게 문제를 해결 했어.하지만 코드에 2 가지 수정을 했어. 다른 사람들이 네 답을 준비하는 데 도움이 될거야. ** ** 처음 수정 **은'selected'를'observable 'observableArray' ** ** 두 번째 수정 ** 'var data = ko.utils.unwrapObservable (valueAccessor());'문을'change' 이벤트 내부로 옮겨야했습니다. 이것은 이전에 말한 것처럼 모델 자체에서이 속성을 읽으려고 할 때 null을 받았기 때문에'binding '핸들러 외부에서'selected' 속성을 읽을 수 있다는 점에서 매우 중요했습니다. –