Knockout JS: вызов функции дважды - PullRequest
0 голосов
/ 28 августа 2018

Я добавил одно текстовое поле, и я хочу сделать так, чтобы каждая функция keyup вызывалась.

Это мой HTML-код:

<input type="text" id="description" class="form-control" maxlength="255" data-bind="event:{keyup: doSomething},value: property1,valueUpdate:'afterkeyup'"></input>

Это мой нокаут код JS:

define(['uiComponent','ko'], function(Component,ko) {
         return Component.extend({
            defaults:{
                property1: ko.observable(),
                tracks: {
                        property1: true
                  }
            },
            initialize: function () {
                this._super();
            },
            getText: function () {
                return "call the function here..";
            },
            doSomething : function(){
                this.property1.subscribe(function(newValue){
                    console.log(newValue);
                    console.log("inside subscribe");
                });
            }
        });
});

Например: когда я нажимаю «T», он будет вызываться один раз. После того, как я нажимаю «E», он будет звонить 2 раза, а не один раз.

Я хочу делать это при каждом включении ключа, чтобы получить значение текстового поля.

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Это своего рода «анти-паттерн», когда двухсторонние привязки и подписываются на события.

В initialzie создайте подписку на свой наблюдаемый один раз:

initialize: function() {
  /* ... */
  this.property1.subscribe(function(newValue) { /* ... */ });
}

Если вы планируете удалить компонент позже, вы можете сохранить подписку и утилизировать ее после удаления. (Подобно тому, что вы в настоящее время делаете на каждом мероприятии.)

Теперь, когда происходит keyup, нокаут читает value со входа, записывает его в property1 и вызывает подписанную функцию.

0 голосов
/ 28 августа 2018

Наконец-то я получил свое решение:

Мне нравится, что один из возможных обходных путей - сохранить возвращенный объект подписка при вызове подписки и, если уже есть сохраненная подписка , существует утилизировать его до подписаться снова.

define(['uiComponent','ko'], function(Component,ko) {
         return Component.extend({
            defaults:{
                property1: ko.observable(),
                subscription : null,
                tracks: {
                        property1: true
                  }
            },
            initialize: function () {
                this._super();
            },
            getText: function () {
                return "call the function here..";
            },
            doSomething : function(){
                if (this.subscription)
                    this.subscription.dispose();

                this.subscription = this.property1.subscribe(function(newValue){
                    console.log(newValue);
                    console.log("inside subscribe");
                });
            }
        });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...