programing

어떻게 하면 녹아웃 JS가 초점 손실 대신 키 누름으로 데이터를 바인딩할 수 있습니까?

mailnote 2023. 9. 8. 21:39
반응형

어떻게 하면 녹아웃 JS가 초점 손실 대신 키 누름으로 데이터를 바인딩할 수 있습니까?

녹아웃 js 예제는 필드를 편집하고 TAB를 누르면 뷰 모델 데이터와 필드 아래의 텍스트가 업데이트됩니다.

이 코드를 변경하여 키를 누를 때마다 뷰 모델 데이터가 업데이트되도록 하려면 어떻게 해야 합니까?

alt text

<!doctype html>
<html>
    <title>knockout js</title>
    <head>
        <script type="text/javascript" src="js/knockout-1.1.1.debug.js"></script>
        <script type="text/javascript">
        window.onload= function() {

            var viewModel = {
                firstName : ko.observable("Jim"),
                lastName : ko.observable("Smith")
            };
            viewModel.fullName = ko.dependentObservable(function () {
                return viewModel.firstName() + " " + viewModel.lastName();
            });

            ko.applyBindings(viewModel);
       }
        </script>
    </head>
    <body>
        <p>First name: <input data-bind="value: firstName" /></p>
        <p>Last name: <input data-bind="value: lastName" /></p>
        <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>
    </body>
</html>
<body>
        <p>First name: <input data-bind="value: firstName, valueUpdate: 'afterkeydown'" /></p>
        <p>Last name: <input data-bind="value: lastName, valueUpdate: 'afterkeydown'" /></p>
        <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>
</body>

문서에서

추가 파라미터

  • valueUpdate

    바인딩에 valueUpdate라는 매개 변수도 포함되어 있는 경우 변경 사항을 탐지하기 위해 KO가 사용할 브라우저 이벤트를 정의합니다.다음 문자열 값이 가장 일반적으로 유용합니다.

    • "change"(기본값) - 변경 직후 사용자가 포커스를 다른 컨트롤로 이동할 때 또는 요소의 경우 보기 모델을 업데이트합니다.

    • "key up" - 사용자가 키를 놓으면 보기 모델이 업데이트됩니다.

    • "키 누름" - 사용자가 키를 입력하면 보기 모델이 업데이트됩니다.키 업과 달리 사용자가 키를 누른 상태에서 반복적으로 업데이트됩니다.

    • "키다운 후" - 사용자가 문자 입력을 시작하는 즉시 보기 모델을 업데이트합니다.이것은 브라우저의 키다운 이벤트를 잡고 이벤트를 비동기적으로 처리함으로써 작동합니다.

보기 모델을 실시간으로 업데이트하려면 이 옵션 중 "키다운 후"가 가장 좋습니다.

버전 3.2에서는 간단하게 텍스트 입력 바인딩을 사용할 수 있습니다.

<input data-bind="textInput: userName" />

이것은 두 가지 중요한 일을 합니다.

  • 즉각적인 업데이트를 실시합니다.
  • 잘라내기, 끌기, 자동 완성...에 대한 브라우저 차이를 처리합니다.

따라서 추가 모듈, 사용자 정의 컨트롤 등이 필요 없습니다.

업데이트를 원하는 경우afterkeydown"기본적으로," 당신은 그를 주입할 수 있습니다.valueUpdate구속력이 있는value구속력 있는 핸들러새 제품만 공급하면 됩니다.allBindingsAccessor다음을 포함하여 핸들러가 사용할 수 있도록 합니다.afterkeydown.

(function () {
    var valueHandler = ko.bindingHandlers.value;
    var getInjectValueUpdate = function (allBindingsAccessor) {
        var AFTERKEYDOWN = 'afterkeydown';
        return function () {
            var allBindings = ko.utils.extend({}, allBindingsAccessor()),
                valueUpdate = allBindings.valueUpdate;

            if (valueUpdate === undefined) {
                return ko.utils.extend(allBindings, { valueUpdate: AFTERKEYDOWN });
            } else if (typeof valueUpdate === 'string' && valueUpdate !== AFTERKEYDOWN) {
                return ko.utils.extend(allBindings, { valueUpdate: [valueUpdate, AFTERKEYDOWN] });
            } else if (typeof valueUpdate === 'array' && ko.utils.arrayIndexOf(valueUpdate, AFTERKEYDOWN) === -1) {
                valueUpdate = ko.utils.arrayPushAll([AFTERKEYDOWN], valueUpdate);
                return ko.utils.extend(allBindings, {valueUpdate: valueUpdate});
            }
            return allBindings;
        };
    };
    ko.bindingHandlers.value = {
        // only needed for init
        'init': function (element, valueAccessor, allBindingsAccessor) {
            allBindingsAccessor = getInjectValueUpdate(allBindingsAccessor);
            return valueHandler.init(element, valueAccessor, allBindingsAccessor);
        },
        'update': valueHandler.update
    };
} ());

만약 당신이 편치 않다면, 당신이 "우월"할 것입니다.valuebinding, 재정의하는 사용자 정의 바인딩에 다른 이름을 지정하고 해당 바인딩 핸들러를 사용할 수 있습니다.

ko.bindingHandlers.realtimeValue = { 'init':..., 'update':... };

데모

이와 같은 솔루션은 녹아웃 버전 2.x에 적합할 것입니다.녹아웃 팀은 녹아웃 버전 3 이상의 텍스트 입력 바인딩을 통해 텍스트와 유사한 입력에 대한 보다 완벽한 바인딩을 구체화했습니다.텍스트 입력을 위한 모든 텍스트 입력 방법을 처리할 수 있도록 설계되었으며,textarea. 실시간 업데이트까지 처리할 수 있어 이 접근 방식이 효과적으로 쓸모없게 됩니다.

제프 메르카도의 대답은 환상적이지만 아쉽게도 녹아웃 3으로 깨졌습니다.

하지만 녹아웃 3 변경 작업을 하면서 ko dev들이 제시한 답변을 찾았습니다.아래 의견은 https://github.com/knockout/knockout/pull/932 에서 확인할 수 있습니다.코드:

//automatically add valueUpdate="afterkeydown" on every value binding
(function () {
    var getInjectValueUpdate = function (allBindings) {
        return {
            has: function (bindingKey) {
                return (bindingKey == 'valueUpdate') || allBindings.has(bindingKey);
            },
            get: function (bindingKey) {
                var binding = allBindings.get(bindingKey);
                if (bindingKey == 'valueUpdate') {
                    binding = binding ? [].concat(binding, 'afterkeydown') : 'afterkeydown';
                }
                return binding;
            }
        };
    };

    var valueInitHandler = ko.bindingHandlers.value.init;
    ko.bindingHandlers.value.init = function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        return valueInitHandler(element, valueAccessor, getInjectValueUpdate(allBindings), viewModel, bindingContext);
    };
}());

http://jsfiddle.net/mbest/GKJnt/

Edit Ko 3.2.0은 이제 새로운 "textInput" 바인딩으로 보다 완벽한 솔루션을 제공합니다.Salvidor Dali의 답변 보기

언급URL : https://stackoverflow.com/questions/4386311/how-can-i-get-knockout-js-to-data-bind-on-keypress-instead-of-lost-focus

반응형