2017-01-04 8 views
0

У меня есть событие для удаления внутренних сообщений в моем приложении: кнопка впереди, с событием клика, который вызывает метод. Все работает нормально.Meteor.call не работает внутри поля подтверждения подтверждения слайдера

Но перед вызовом метода я бы хотел подтвердить поле «Вы уверены, что хотите удалить это сообщение?»

Со стандартным подтверждением функции js работает нормально. Но стандартный js confirmbox ... Никакой стиль не допускается.

Так что моя идея состояла в том, чтобы использовать sweetalert: все идет хорошо, Berts уведомления, а также, но сообщение не будет удалено ..

Ниже мое событие, подтвердить коробочную версию & версии sweetalert и метод.

Спасибо!

версия окно подтверждения

Template.Users.events({ 
    'click .toggle-admin': function() { 
     Meteor.call('toggleAdmin', this._id); 
    }, 
    'click button.delete-message':function() { 
     if(confirm('Are you sure?')) { 
      Meteor.call('deleteMessage', this._id, function(error) { 
       if(error) { 
        Bert.alert({ 
         title: 'Error', 
         message: error.reason, 
         type: 'danger' 
        }); 
       } else { 
        Bert.alert({ 
         title: 'Success', 
         message: 'Message deleted.', 
         type: 'success' 
        }); 
       } 
      }); 
     } 
    } 
}); 

sweetalert версия

Template.Users.events({ 
    'click .toggle-admin': function() { 
     Meteor.call('toggleAdmin', this._id); 
    }, 
    'click button.delete-message':function() { 
     swal({ 
      title: "Are you sure?", 
      text: "You will not be able to recover this message!", 
      type: "warning", 
      showCancelButton: true, 
      confirmButtonColor: "#DD6B55", 
      confirmButtonText: "Yes, delete it!" 
     }).then(function(){ 
      Meteor.call('deleteMessage', this._id, function(error) { 
       if(error) { 
        Bert.alert({ 
         title: 'Error', 
         message: error.reason, 
         type: 'danger' 
        }); 
       } else { 
        Bert.alert({ 
         title: 'Success', 
         message: 'Message deleted.', 
         type: 'success' 
        }); 
       } 
      }); 
     }) 
    } 
}); 

метод

Meteor.methods({ 
    insertMessage: function(message) { 
     ContactMessages.insert(message); 
    }, 
    deleteMessage: function(messageId) { 
     ContactMessages.remove({_id: messageId}); 
    } 
}); 
+0

Я думаю 'this' это не то, что вы ожидаете, что это будет внутри обратного вызова. – MasterAM

+0

@MasterAM Не могли бы вы уточнить? – Ontokrat

ответ

1

Нати ve window.confirm() является синхронным и блокирует поток выполнения JS. Это означает, что, как только пользователь отвечает на приглашение, возвращается значение, и выполнение продолжается с этой точки. Именно по этой причине вы можете успешно использовать this._id.

С помощью асинхронного API, такого как swal2, который использует обещания, вы передаете функцию для ее обработки после ее разрешения или отклонения (то, что вы переходите на then). В этих обратных вызовах больше не указывает на исходный объект, поэтому вам необходимо сохранить доступ к нему (или другим требуемым данным), используя закрытие или лексически привязывая его к arrow function.

Использование закрытия:

Template.Users.events({ 
    'click button.delete-message'() { 
    const id = this._id; 
    swal({ 
     // ... 
    }).then(function(){ // `id` is available from external function 
     Meteor.call('deleteMessage', id, function(error) { 
     // ... 
     }); 
    }) 
    } 
}); 

лексическую область связывания с помощью функции стрелка:

Template.Users.events({ 
    'click button.delete-message'() { 
    swal({ 
     // ... 
    }).then(() => { //bound to the current `this` 
     Meteor.call('deleteMessage', this._id, function(error) { 
     // ... 
     }); 
    }) 
    } 
}); 
+0

Работает очень хорошо. Спасибо! – Ontokrat

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

  • Нет связанных вопросов^_^