2014-01-28 2 views
0

У меня есть представление, в котором я показываю информацию о сотруднике. В этом представлении у меня есть флажок, например: Recieve Daily Email. Когда пользователь нажимает на этом поле, мне нужно выполнить функцию AJAX как вид проверки, чтобы проверить, если пользователь может изменить эту настройку:Выполнение функции перед изменением свойств viewmodel

If result is true: allow knockout to change the ViewModel Property 
If result is false: prevent knockout to change the ViewModel Property 

Я сделал простой demo, чтобы продемонстрировать мою проблему. Я предположил, что моя функция AJAX 'll return false. Попытайтесь нажать на флажок, затем нажмите кнопку, чтобы проверить значение ViewModel, оно будет истинным, хотя оно не проверено (из-за return false).

Любые предложения?

ответ

0

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

При создании Person это может быть, как:

function Person(name, receiveMail) { 
    this.name = name; 
    this.receiveMail = ko.observable(receiveMail); 

    this.receiveMail.subscribe(function() { 
     //do AJAX here 
     setTimeout(function() { 
      this.receiveMail(false); 
     }.bind(this), 1000); 
    }, this); 
} 

Таким образом, мы делаем receiveMail наблюдаемой и подписаться на это изменение в модели представления. Когда t изменяется, вы можете сделать свой AJAX-вызов, а затем ответить соответствующим образом.

Вот скрипка, который демонстрирует это наряду с сообщением об ошибке: http://jsfiddle.net/rniemeyer/pMmvf/

+0

но при изменении наблюдаемого '' receiveMail' в setTimeout' это будет запускать 'функцию subscribe' снова, верно? –

+0

В текущем примере он запускает его один раз. Было бы легко управлять этим с помощью дополнительного флага, например: http://jsfiddle.net/rniemeyer/eKdxZ/. Если вы используете вызов AJAX, вы можете установить флаг в true, прежде чем делать запрос AJAX (чтобы предотвратить потенциально несколько запросов), а затем очистить его, если вызов AJAX завершился с ошибкой. –

Смежные вопросы