2012-05-18 3 views
5

Я использую KnockoutJS с SammyJS для одностраничного приложения.Как предотвратить отправку формы

В HTML у меня есть тэг формы, как следовать

<form data-bind='submit: search'> 
    <label>Find user:</label> 
    <input data-bind='value: name' /> 
</form> 

и в моем ViewModel, объявил две функции и Сэого маршрут URL

function ViewModel() { 
    var self = this; 
    self.name = ko.observable(""); 
    self.search = function() { 
     alert(self.name); 
    }; 

    Sammy(function() { 
     this.get('#:id', function() { 
      //do something.... 
     });   
    }).run(); 
} 

ko.applyBindings(new ViewModel()); 

Весь код работает хорошо, пока я не что-то типа в текстовом поле затем отправьте форму. Я не ожидал просмотра URL-адресов после окна предупреждения, но URL-адрес изменился на что-то вроде этого: «http: // localhost: 8258/undefined?» мой оригинальный URL-адрес «http: // localhost: 8258»

Я усомнился в том, что smmy url routing, поэтому удаленный код sammy из javascript-кода, затем URL-адрес не изменяется после окна предупреждения. Возможно, я не понимаю, как работает sammy.

Как предотвратить изменение URL в этом случае?

+0

вы пробовали возвращение 'false' из вашей' функции self.search'? –

+0

спасибо Джин, я заметил, что я не установил почтовый маршрут в Сэмми. – Ray

+1

Незначительная точка ... так как 'self.name' является функцией, вы должны вызывать' alert (self.name()) '. –

ответ

5

Sammy привязывается к формам, чтобы вы могли регистрировать маршруты для них.

<form action="#1234" method="post"> 

JS:

Sammy(function() { 
    this.post('#:id', function() { 
     // do something... 

     return false; // avoid form submission 
    }); 

    // ... 
}).run(); 
3

Я также имел эту проблему, и я нашел решение в this answer. Вот как вы можете сделать Sammy.js оставить формы в одиночку:

Sammy(function() { 

    // Your routing.. 
    this.get('#:id', function() { 
     //do something.... 
    }); 


    // Make Sammy.js leave the forms alone! 
    this._checkFormSubmission = function(form) { 
     return false; 
    }; 

}).run(); 

Работает как он должен :)