잘못된 BindingHandler가 호출 됨

마이크 윌스

드롭 다운이 변경 될 때 잘못된 바인딩 처리기가 호출되는 매우 이상한 문제가 있습니다. jQuery 1.9.1과 함께 Knockout 3.1을 사용하고 있습니다. 직원을 쉽게 찾을 수 있도록 일련의 계단식 드롭 다운이 있습니다.

여기에 무슨 일이 벌어집니다. 페이지가로드되면 각 핸들러가 예상대로 호출됩니다. 나는의 값을 변경하면 하지,라고 처리기를 예상대로. 드롭 다운 을 제대로 채우기 위해 호출해야하는 전혀 호출되지 않습니다 . 그러나 변경하면 , 가 호출되고 예상대로 작동합니다.#AssignedDepartmentserviceAreaSelectdepartmentSelectdepartmentSelect#AssignedServiceAreaName#AssignedServiceAreaNameserviceAreaSelect

여기서 무슨 일이 벌어 질까요? 이 코드는 Knockout 2.x에서 잘 작동했습니다.

다음은 세 개의 연속 드롭 다운에 대한 세 가지 핸들러 중 두 가지입니다.

// Department Selected
ko.bindingHandlers.departmentSelect = {
    update: function (element, valueAccessor, allBindingsAccessor, vm) {
        var el = $(element).find("option:selected");
        console.log("Department Selected: ", el.val());
        if (el.length > 0) {
            vm.deptName(el.text());
            $.get('/customerservice/jsonproxy/servicearealist', { deptID: el.val() }, function (response) { vm.ServiceArea(response); }, 'json');
        }
    }
}

// Service Area Selected
ko.bindingHandlers.serviceAreaSelect = {
    update: function (element, valueAccessor, allBindingsAccessor, vm) {
        var el = $(element).find("option:selected");
        console.log("Service Area Selected: ", el.val());
        if (el.length > 0) {
            vm.ServiceAreaName(el.text());
            $.get('/customerservice/jsonproxy/employeelist', { deptID: vm.deptID, serviceAreaID: el.val() }, function (response) {
                vm.EmployeeList(response[0].Employees);
                vm.EmployeeList.unshift({ EmployeeName: "None Assigned", EmployeeID: "" });
            }, 'json');

        }
    }
};

다음은 HTML입니다.

<div class="row-fluid">
<div class="span4">

    @Html.MyLabelFor(m => m.Department, new { @class = "control-label" })

    <select class="span12" id="AssignedDepartment" name="AssignedDepartment" 
        data-bind="options: dept, optionsCaption: 'Select a department', optionsValue: function (item) { return item.DepartmentID }, optionsText: function (item) { return item.DepartmentName; }, value: deptID, departmentSelect: deptID"></select>
    <span data-bind="text: deptID"></span><span data-bind="    text: deptName"></span>
    @Html.HiddenFor(m => m.Department, new { data_bind = "value: deptName" })
    @Html.HiddenFor(m => m.DepartmentCode, new { data_bind = "value: deptID" })

</div>
<div class="span4">

    @Html.MyLabelFor(m => m.ServiceArea, new { @class = "control-label" })

    <select class="span12" id="AssignedServiceAreaName" name="AssignedServiceArea" data-bind="options: ServiceArea, optionsCaption: 'Select a Service Area', optionsValue: function (item) { return item.ServiceAreaID; }, optionsText: function (item) { return item.ServiceAreaName; }, value: ServiceAreaID, serviceAreaSelect: ServiceAreaID"></select>
    @Html.HiddenFor(m => m.ServiceArea, new { @data_bind = "value: ServiceAreaName" })
    @Html.HiddenFor(m => m.ServiceAreaCode, new { @data_bind = "value: ServiceAreaID" })
    @*<span data-bind="text: ServiceAreaID"></span><span data-bind="    text: ServiceAreaName"></span>*@

</div>
<div class="span4">

    @Html.MyLabelFor(m => m.Employee, new { @class = "control-label" })

    <select class="span12" id="AssignedEmployee" name="AssignedEmployee" data-bind="options: EmployeeList, optionsCaption: 'None Assigned', optionsValue: function (item) { return item.EmployeeID; }, optionsText: function (item) { return item.EmployeeName; }, value: EmployeeID, employeeSelect: EmployeeID"></select>
    @*<span data-bind="text: EmployeeID"></span><span data-bind="    text: EmployeeName"></span>*@
    @Html.HiddenFor(m => m.Employee, new { data_bind = "value: EmployeeName" })
    @Html.HiddenFor(m => m.EmployeeID, new { data_bind = "value: EmployeeID" })

</div>
</div>
huocp

update콜백은 모델 변경이 아닌 장소의 응답에 DOM을 다시 그릴 수 있도록 설계되었습니다 to update model when DOM changes(코드에서 알 수 있듯이).

updateDOM을 업데이트하기 위해 콜백에서 모델의 값만 읽고 콜백 내부에서 모델을 변경하지 마십시오 update.

value바인딩 (값 : deptID)은 동기화 모델 (deptID), 다른 bindingHandler 필요하지 않습니다와 DOM을.

당신이 원하는 것은 단지 do something when model changes.

  1. 제거 ko.bindingHandlers.departmentSelectko.bindingHandlers.serviceAreaSelectko.bindingHandlers.employeeSelect
  2. 바인딩을 제거 departmentSelect: deptID, serviceAreaSelect: ServiceAreaIDemployeeSelect: EmployeeID.
  3. 자신의 대답이 제안한대로 모델에서 논리를 수행하십시오.

예, 여전히 ko스타일이 아닌 코드 self.deptName($('#AssignedDepartment option:selected').text())있습니다.

이상적으로 ko 앱에서 모든 DOM 조작은 bindingHandler initupdate콜백 내에 숨겨져 야합니다 .

문제를 해결하는 방법에는 두 가지가 있습니다.

A) deptName을 자동으로 업데이트합니다.

self.deptID.subscribe(function (val) {
    if (val !== undefined && val !== null) {
        $.get('/customerservice/jsonproxy/servicearealist', { deptID: val }, function (response) {
            self.ServiceArea(response);
            if (response.length === 1) {
                self.ServiceAreaID(response[0].ServiceAreaID);
            }
        }, 'json');
    }
});

// deptName is another representation of deptID
self.deptName = ko.computed(function() {
    // I don't know whether your dept is observableArray or plain array
    var depts = ko.unwrap(self.dept);
    var currentOne = ko.utils.arrayFirst(depts, function(d) {
        return d.DepartmentID == self.deptID();
    });
    return currentOne && currentOne.DepartmentName;
});

B) 모델을 변경하고 deptID를 캡처하지 말고 전체 deptSelected 개체를 캡처합니다.

//self.deptID = ko.observable();    
self.deptSelected = ko.observable();
self.deptSelected.subscribe(function (newDept) { /* ajax */ });

// optionsText: 'DepartmentName' is enough, no need a mapping function.
<select class="span12" id="AssignedDepartment" name="AssignedDepartment" 
    data-bind="options: dept, optionsCaption: 'Select a department',
               optionsText: 'DepartmentName', value: deptSelected"></select>
<!-- ko with: deptSelected -->
    <span data-bind="text: DepartmentID"></span>
    <span data-bind="text: DepartmentName"></span>
    @Html.HiddenFor(m => m.Department, new { data_bind = "value: DepartmentName" })
    @Html.HiddenFor(m => m.DepartmentCode, new { data_bind = "value: DepartmentID" })
<!-- /ko -->

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

c ++-잘못된 소멸자가 호출 됨

분류에서Dev

생성자가 잘못된 시간에 호출 됨

분류에서Dev

OS X 명령 줄에서 잘못된 ctag가 호출 됨

분류에서Dev

UITableViewCell에서 호출 된 UIActivityViewController가 잘못 표시됨

분류에서Dev

잘못된 컨트롤러 함수가 호출 됨

분류에서Dev

잘못된 템플릿 함수가 호출 됨

분류에서Dev

SWT Canvas PaintListener ()가 잘못 호출 됨

분류에서Dev

두 번째 생성자가 C ++에서 호출 됨 (잘못된 출력)

분류에서Dev

Angular 10 및 RxJ에서 잘못된 동작 유형 또는 잘못된 감속기가 호출 됨

분류에서Dev

gRPC 단항 호출에서 'start_batch가 잘못 호출 됨'

분류에서Dev

NSNumber 할당 문제. 잘못된 번호가 지정됨

분류에서Dev

setParent가 호출 될 때 QMenu가 잘못 표시됨

분류에서Dev

onCreate () 및 onPause ()가 다른 활동에서 잘못 호출 됨

분류에서Dev

서명 차이로 인해 잘못된 자식 클래스 함수가 호출 됨

분류에서Dev

.net 원격, 델리게이트가 잘못된 프로세스에서 호출 됨

분류에서Dev

어셈블리 호출이 잘못된 주소로 매핑 됨

분류에서Dev

사용자 입력으로 인해 잘못된 If-Statement 분기가 출력 됨

분류에서Dev

PowerShell Get-ADUser 암호 만료로 인해 잘못된 날짜가 제공됨

분류에서Dev

현재 스크롤 위치가 잘못된 번호로 업데이트 됨

분류에서Dev

기호에 대한 Clojure 문자열이 잘못된 결과로 평가됨

분류에서Dev

ExpandableListAdapter에 잘못된 childView가 표시됨

분류에서Dev

UIImageView가 잘못된 UITableViewCell에 표시됨

분류에서Dev

절전 모드가있는 nohup bash 호출이 잘못 평가됨

분류에서Dev

vim을 호출기로 사용할 때`man ascii`가 잘못 정렬 됨

분류에서Dev

FFMPEG : 이미지가 잘못된 FPS에서 잘못로드 됨

분류에서Dev

Javascript WebRTC 원격 응답 설정 실패 sdp : 잘못된 상태로 호출 됨 : kHaveRemoteOffer 및 잘못된 상태로 호출 됨 : kStable

분류에서Dev

WebAPI 2 : 기본 GET ALL이 잘못된 매개 변수로 호출 됨

분류에서Dev

여러 공유 라이브러리에서 호출되고 libstdc ++ 정적 링크가 활성화 된 경우 C ++ 스트림이 잘못됨

분류에서Dev

두 NSDates의 계산 된 차이가 잘못됨-수정 됨

Related 관련 기사

  1. 1

    c ++-잘못된 소멸자가 호출 됨

  2. 2

    생성자가 잘못된 시간에 호출 됨

  3. 3

    OS X 명령 줄에서 잘못된 ctag가 호출 됨

  4. 4

    UITableViewCell에서 호출 된 UIActivityViewController가 잘못 표시됨

  5. 5

    잘못된 컨트롤러 함수가 호출 됨

  6. 6

    잘못된 템플릿 함수가 호출 됨

  7. 7

    SWT Canvas PaintListener ()가 잘못 호출 됨

  8. 8

    두 번째 생성자가 C ++에서 호출 됨 (잘못된 출력)

  9. 9

    Angular 10 및 RxJ에서 잘못된 동작 유형 또는 잘못된 감속기가 호출 됨

  10. 10

    gRPC 단항 호출에서 'start_batch가 잘못 호출 됨'

  11. 11

    NSNumber 할당 문제. 잘못된 번호가 지정됨

  12. 12

    setParent가 호출 될 때 QMenu가 잘못 표시됨

  13. 13

    onCreate () 및 onPause ()가 다른 활동에서 잘못 호출 됨

  14. 14

    서명 차이로 인해 잘못된 자식 클래스 함수가 호출 됨

  15. 15

    .net 원격, 델리게이트가 잘못된 프로세스에서 호출 됨

  16. 16

    어셈블리 호출이 잘못된 주소로 매핑 됨

  17. 17

    사용자 입력으로 인해 잘못된 If-Statement 분기가 출력 됨

  18. 18

    PowerShell Get-ADUser 암호 만료로 인해 잘못된 날짜가 제공됨

  19. 19

    현재 스크롤 위치가 잘못된 번호로 업데이트 됨

  20. 20

    기호에 대한 Clojure 문자열이 잘못된 결과로 평가됨

  21. 21

    ExpandableListAdapter에 잘못된 childView가 표시됨

  22. 22

    UIImageView가 잘못된 UITableViewCell에 표시됨

  23. 23

    절전 모드가있는 nohup bash 호출이 잘못 평가됨

  24. 24

    vim을 호출기로 사용할 때`man ascii`가 잘못 정렬 됨

  25. 25

    FFMPEG : 이미지가 잘못된 FPS에서 잘못로드 됨

  26. 26

    Javascript WebRTC 원격 응답 설정 실패 sdp : 잘못된 상태로 호출 됨 : kHaveRemoteOffer 및 잘못된 상태로 호출 됨 : kStable

  27. 27

    WebAPI 2 : 기본 GET ALL이 잘못된 매개 변수로 호출 됨

  28. 28

    여러 공유 라이브러리에서 호출되고 libstdc ++ 정적 링크가 활성화 된 경우 C ++ 스트림이 잘못됨

  29. 29

    두 NSDates의 계산 된 차이가 잘못됨-수정 됨

뜨겁다태그

보관