Изменить значение переключателя на основе ответа ajax

Я связываю массив объектов с JSViews с объектом по умолчанию. Я показываю вариант по умолчанию с переключателем. Когда я хочу сделать другой объект по умолчанию, мне нужно сделать вызов ajax и изменить его на объект по умолчанию только тогда, когда вызов завершается успешно с предопределенным статусом. Я использую обещания для запросов ajax. Я знаю, возвращаю ли я false в функция, статус переключателя не изменится. Я пробовал что-то подобное, но это не работает. Я предполагаю, что, поскольку я возвращаю обещание, к моменту его возврата оно не становится истинным или ложным. Как это можно сделать?

<input type="radio" name="default" data-link="checked{:isDefaultObj} {on ~setAsDefault}">

JS

setAsDefault:function(){
  return service.setAsDefaultObj('123').then(function(response){
        return response; //response is either true or false;
    },function(response){
       return response;
   });
 }

person user1776573    schedule 28.10.2016    source источник
comment
Если приведенный ниже ответ сработал для вас, могли бы вы его принять? Спасибо... (Это не признание времени и усилий, потраченных на то, чтобы ответить вам!)   -  person BorisMoore    schedule 10.11.2016
comment
@BorisMoore: Мне очень жаль ... Я не смог ответить на решение, так как пару недель работал над несвязанными проектами ... Я попробую решение и обновлю статус. Ваш своевременный ответ очень ценится. Извиняюсь, что не отследил. Обязательно сделаю это в будущем. Спасибо.   -  person user1776573    schedule 11.11.2016


Ответы (1)


Для ~setAsDefault вы можете вернуть false, чтобы действие щелчка по умолчанию для проверки ввода было пропущено.

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

Вот пример привязки данных к selectedCar с отложенной настройкой соответствующего значения.

Либо используйте одностороннюю привязку данных:

<label><input name="cars" type="radio" value="none" data-link="{:selectedCar} {on getAjax 'none'}"/>
  None</label><br/>
<label><input name="cars" type="radio" value="vlv" data-link="{:selectedCar} {on getAjax 'vlv'}"/>
  Volvo</label><br/>
<label><input name="cars" type="radio" value="frd" data-link="{:selectedCar} {on getAjax 'frd'}"/>
  Ford</label><br/><br/>

Или используйте свой checked{...} подход

<label><input name="cars2" type="radio" value="none" data-link="checked{:selectedCar==='none'} {on getAjax 'none'}"/>
  None</label><br/>
<label><input name="cars2" type="radio" value="vlv" data-link="checked{:selectedCar==='vlv'}  {on getAjax 'vlv'}"/>
  Volvo</label><br/>
<label><input name="cars2" type="radio" value="frd" data-link="checked{:selectedCar==='frd'}  {on getAjax 'frd'}"/>
  Ford</label><br/><br/>

В каждом случае используйте следующий подход к коду:

var data = {
  selectedCar: "frd",
  getAjax: function(val) {
    var sel = data.selectedCar;
    $.ajax({
      type: 'GET',
      url: "../TEST" + val + ".html",
      timeout: 5000,
      success: function(){
        $.observable(data).setProperty("selectedCar", val);
      },
      error: function(xhr, textStatus, errorThrown){
        $.observable(data).setProperty("selectedCar", val);
        $.observable(data).setProperty("selectedCar", sel);
      }
    });
    return false;
  }
};
person BorisMoore    schedule 29.10.2016