Консоль отображает неперехваченную ошибку типа: объект не является функцией, все остальное работает нормально

#javascript #jquery #knockout.js

#javascript #jquery #knockout.js

Вопрос:

Пример короткого кода:http://jsfiddle.net/j2nsg/2 /

JS:

 function AppViewModel() {
    var self = this;
    self.values = ko.observableArray([{annotation:"blah2"}, {annotation:"blah4"}]);
}
$("#delete").click(function() {
    var removeMe = {annotation: "blah2"};
    model.values.remove(function(item) {
        return _.isEqual(item, removeMe); //this is just a deep equals between objects, actual code has far more complex stuff
    });
});

var model = new AppViewModel();
ko.applyBindings(model);
  

HTML:

 <div id="Menu">
    <p>Stuff In list:</p>
    <select id="resultsDb" data-bind="foreach:values">
        <option data-bind="text:annotation">
    </select>
</div>
<br>
<a href="javascript:null()" id="delete">delete</a>
  

Все, что это делает, это заполняет наблюдаемый массив в knockout и предоставляет кнопку для удаления элемента при нажатии. Однако, если вы нажмете кнопку, консоль отобразит ошибку Uncaught TypeError: object is not a function . С точки зрения функциональности, все кажется, работает. Есть ли способ исправить эту ошибку (если это вообще ошибка)?

Редактировать: Строка для ошибки (для chrome) гласит VM994: 1, (анонимная функция)

Ответ №1:

Это вызвано попыткой вызова null , которая не является функцией. Вместо javascript:null() вы можете просто использовать # или даже полностью оставить href выключенным.

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

1. Не сделает ли отключение href его недоступным?

2. @KevinL нет; он по-прежнему будет реагировать на событие click.

Ответ №2:

Я думаю, вы хотите javascript:void(null)

В любом случае вы должны обрабатывать свой щелчок с помощью knockout, а не jquery. Кроме того, обычно лучше не использовать a элемент для подобных кнопок. Вам лучше использовать button , или span .