Как я могу запретить автозапуск функций JavaScript?

#javascript #knockout.js

#javascript #knockout.js

Вопрос:

Я определил функцию следующим образом в нокаутирующей модели. Когда пользователь нажимает на кнопку редактирования адреса в списке, это покажет форму адреса и заполнит ее выбранным адресом.

         this.editAddress = function (address) {
            self.addressErrors([]);
            self.showAddressForm(1);
            self.formAddress(address);
        }
  

Однако эта функция запускается немедленно после определения, и форма отображается при загрузке страницы. Что я могу сделать, чтобы предотвратить это?

вот список html с привязками (упрощенный)

 <ul data-bind="foreach: userAddresses">
    <li>
        <div>
            <p data-bind="text: addressTitle"></p>
            <p data-bind="text: nameSurname"></p>
            <p>
                <span data-bind="text: addressLine1"></span> <span data-bind="text: addressLine2"></span>
            </p>
            <p><button class="btn btn-default" data-bind="click: $root.editAddress($data)">Edit address</button></p>
        </div>
    </li>
</ul>
  

Комментарии:

1. Покажите HTML-кнопку, которая привязывается к функции и определению модели.

2. Когда вы определяете функцию, как описано выше, она не будет запускаться. Сначала вы должны вызвать функцию. Чтобы устранить это, я советую поместить строку console.log («Сделал это здесь») в вашу функцию, чтобы проверить, запущена ли она. Если у вас есть несколько похожих функций, я советую разместить уникальный консольный журнал.

3. ну, я думаю, этот вопрос больше касается привязки щелчка нокаутом. каким-то образом он запускает определенную функцию в bind.

Ответ №1:

Я не думаю, что это выполняется немедленно, я думаю, что ваша привязка к форме выполняет это.

В частности, эта строка:

 <p><button class="btn btn-default" data-bind="click: $root.editAddress($data)">Edit address</button></p>
  

Обратите внимание, что ваша привязка к щелчку $root.editAddress($data)

Измените вашу привязку следующим образом:

 <p><button class="btn btn-default" data-bind="click: $root.editAddress">Edit address</button></p>
  

Обратите внимание на удаление ($data) . click: ожидает ссылку на функцию.

Удаление ($data) немедленно остановит привязку от выполнения вашей функции. (До того, как вы вызывали $root.editAddress немедленный вызов, и он возвращал ‘undefined’, так что ваш click: был фактически привязан к undefined .)

Обратите внимание, что knockout автоматически переходит $data к вашей функции, поэтому вам не нужно делать ничего сложного.

Комментарии:

1. Только что понял это, и вы спасли меня от ответа на мой собственный вопрос. И это хорошее объяснение проблемы. 🙂

2. @Azadrum, похоже, ответ всегда приходит через несколько мгновений после запроса… 🙂 Рад, что вы разобрались с этим.

Ответ №2:

Возможно, вы можете выполнить действие при событии, таком как щелчок. Я не знаком с knockout.js но это может быть полезно.

http://knockoutjs.com/documentation/click-binding.html

Удачи.

Комментарии:

1. Спасибо, что указали документацию. Перечитал это и понял, что если я использую привязку типа data-bind=»click: $ root.editAddress ($data), это автоматически запустит editAddress.