2013-08-09 5 views
6

KnockoutJS에서 '조건부 클릭'바인딩을 만들고 싶습니다. 기본적으로 Knockout에서 사용하는 것처럼 표준 클릭 바인딩이지만 첨부 된 함수를 실행하려면 조건을 충족해야합니다. 필자의 경우 가장 좋은 방법은 사용자 정의 바인딩 핸들러를 작성하여 허용되는 경우 표준 클릭 바인딩을 호출하는 것입니다.표준 호출 맞춤 바인딩에서 녹아웃 클릭 바인딩

ko.bindingHandlers.safeClick = { 
    'init': function(element, valueAccessor, allBindingsAccessor, context) { 
     $(element).click(function() { 
      if(mycondition == true) { 
       // call the standard click binding here -> this is the part I don't know 
      } 
     }); 
    } 
} 

내 모든 표준 클릭 바인딩을이 사용자 지정 바인딩으로 바꾸려고합니다. 따라서 올바른 방식으로 클릭 바인딩을 호출하는 것이 중요하므로 HTML에 제공된 모든 매개 변수가 함수로 전달됩니다. 예를 들어 사용자 지정 바인딩에서 누락 된 부분 좀 도와 수 있다면

<a href="#" data-bind="click: basevm.gotopage.bind($data, '#homepage')">Home</a> 
<a href="#" data-bind="click: itemvm.activateItem">Activate</a> 

이 나는 ​​대단히 감사하겠습니다

<a href="#" data-bind="safeClick: basevm.gotopage.bind($data, '#homepage')">Home</a> 
<a href="#" data-bind="safeClick: itemvm.activateItem">Activate</a> 

로 대체해야합니다.

ko.bindingHandlers.click.init(element, valueAccessor, allBindingsAccessor, context); 

편집 :

답변

11

올바른 방법은 여기 기다리고 클릭을 위임하는 것은 다음과 같다 :

  • 원래 함수를 사용합니다 (예 : valueAccessor() 사용)
  • 새 valueaccessor 함수를 작성하여 조건을 포함하는 새 함수를 리턴 한 다음 원래 함수를 호출하십시오. 이 새로운 값 접근자를 click 바인딩에 전달합니다.

그래서 safeClick는 다음과 같이 표시됩니다

ko.bindingHandlers.safeClick = { 
    'init': function (element, valueAccessor, allBindingsAccessor, 
         viewModel, bindingContext) { 
     var originalFunction = valueAccessor(); 
     var newValueAccesssor = function() { 
      return function() { 
       if (mycondition == true) 
        //pass through the arguments 
        originalFunction.apply(viewModel, arguments); 
      } 
     } 
     ko.bindingHandlers.click.init(element, newValueAccesssor, 
      allBindingsAccessor, viewModel, bindingContext); 
    } 
} 

데모 JSFiddle합니다.

이것은 첫 번째 클릭에 대해 작동하며 click 이벤트에 수동으로 가입하거나 jQuery로 트리거 할 필요가 없습니다.

+0

이 메서드는 조건을 HTML 코드에서 녹아웃 관측 가능으로 전달한다고 가정합니다. 나는 이것을 원하지 않는다. 대신 요소를 클릭 할 때마다 JavaScript 코드에서 조건을 수동으로 확인하려고합니다. 그 일을하는 방법에 대한 조언이 있습니까? –

+0

'if (ko.utils.unwrapObservable (allBindingsAccessor(). 조건))'대신 원하는 것을 쓸 수 있습니다. 링크를 클릭 할 때마다 평가됩니다. 나는 단지 나의 데모 jsfiddle에서 관찰 할 수있는 조건을 필요로했다. 이 수정 된 바이올린을 참조하십시오 : http://jsfiddle.net/w7nKB/2/ – nemesv

+0

정상적인 클릭 바인딩과이 사용자 정의 바인딩 사이의 문제를 설명하기 위해이 피들 (http://jsfiddle.net/Ed8Fc/)을 만들었습니다. 클릭 이벤트를 발생시킨 DOM 요소에 대한 액세스 권한이 있어야합니다. 정상적인 클릭 바인딩을 사용하면 OK이지만 safeClick 바인딩을 사용하면 브라우저 콘솔에 오류가보고됩니다. –

1

당신은 다음과 같이 호출 할 수 있습니다 당신은 mannualy 수있는 이벤트를 처음 클릭 전화 :

ko.bindingHandlers.safeClick = { 
    'init': function(element, valueAccessor, allBindingsAccessor, context) { 
     $(element).click(function() { 
      if(mycondition == true) { 
       ko.bindingHandlers.click.init(element, valueAccessor, allBindingsAccessor, context); 
      } 
     }); 
     if(mycondition == true) { 
      $(element).trigger('click'); 
     } 
    } 
} 
+0

웹 검색 중에 이미이 문제가 발생했습니다. 불행히도 이것은 앵커 요소를 두 번 클릭했을 때만 작동한다는 것을 알았습니다. 내 솔루션은 사용자가 처음 클릭 할 때부터 작동해야합니다. –

+0

업데이트를 참조하십시오. 도움이되기를 바랍니다. –

관련 문제