• Почему не останавливается таймер?

    Можно так:
    this.start = function() {
      	//console.log(interval);
      	if (working) return;
      
      	position = 0;
      	timer = window.setInterval(function(self) {
        	//console.log('timer');
        	position += step;
          on_step(position, from, to);
          if (position >= to) {
          	console.log('end1');
          	self.stop();
          }
        }.bind(null, this), interval);
        on_start();
        working = true;
        on_step(position, from, to);
      };


    Или так:
    this.start = function() {
      	//console.log(interval);
      	if (working) return;
      
      	position = 0;
      	timer = window.setInterval(function() {
        	//console.log('timer');
        	position += step;
          on_step(position, from, to);
          if (position >= to) {
          	console.log('end1');
          	this.stop();
          }
        }.bind(this), interval);
        on_start();
        working = true;
        on_step(position, from, to);
      };

    Во всех этих интервалах контекстом по умолчанию идет переменная window.
    Ответ написан
    Комментировать
  • React + Redux, как начать правильно?

    Довольно годный материал начните с этого...
    Ответ написан
    Комментировать
  • Как понять книгу Рихтера, если ты новичок?

    ИМХО: То что вы читаете книги это прекрасно, но так как вы новичок, не нужно пока забивать себе голову этим Рихтером. Читай те пока общие вещи по ООП, принципам программирования, заглядывайтесь на паттерны, книги по рефакторингу и алгоритмам, смотри те как программируют другие люди, в будущем это принесет вам большую пользу.
    С# - это просто инструмент для выполнения какой-то вашей задачи, а книга Рихтера, как раз рассказывает об особенностях этого языка(описание этого инструмента), что толку от того если ты знаешь глубоко язык и все его нюансы и особенности, когда твой код при компиляции погибает в багах и через 2 месяца ты уже не понимаешь, что и как у тебя устроено. А добавление нового функционала приводит к аду из ошибок и кишков.
    Зная основы не трудно будет даже выбирать инструмент для решение ваших задач, будь то C# или какой-то другой язык.
    Ответ написан
    Комментировать
  • Web Api, параметр метода(POST) приходил null?

    rpe4a
    @rpe4a Автор вопроса
    Проблема решилась, методом тыка... удалил строку
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
    Ответ написан
    Комментировать
  • Как читать и записывать xlsx стандартными средствами .NET?

    Без сторонних врятли... Но много раз уже пользовался ClosedXML
    Ответ написан
    Комментировать
  • Push уведомления на сайте?

    rpe4a
    @rpe4a Автор вопроса
    Вообщем всем спасибо за советы, но ближе всего оказался amf1k. Посмотрев и изучив документацию на
    ASP.NET SignalR у меня криво косо получилось сделать то, что я хочу. Хотел бы описать инструкцию, может кому пригодится:
    1. Вы должны работать на платформе .NET;
    2. Ознакомиться с документацией по ASP.NET Identity
    3. Ознакомиться с документацией по SignalR
    4. Дальше добавляем через Nuget собственно сам SignalR в ваш проект;
    5. Прицепляем его к проекту;
    6. Создаем клиентский скрипт (я вынес его в отдельный файл и сделал ссылку на него на странице):
      $(function () {
         //определяем наш хаб
          var hub = $.connection.notificationHub;
          //метод хаба на клиенте, который будет вызван у всех подключенных клиентов, когда ему будет дана команда с сервера
          hub.client.sendNotification = function (message) {
              //выводим сообщение подключенным клиентам(в моем случае это будут только админы)
              $("#hubMessageConteiner")
                  .append("<li>" + message + "<i title='Закрыть' class='fa fa-close fa-lg cursor-pointer'></i></li>")
                  .find("li").show(200);
          };
          //создаем подключение к хабу, это метод start, если пользователь смог подключится к хабу, то вызывается функция done, если нет то будет вызываться функция fail
          $.connection.hub.start().done(function () {
              $('#Hub').click(function () {
                  hub.server.send("Это push уведомление");
              });
          });
      });


    7. Создаем на бэкенд собственно наш Hub-class который будет обрабатывать эти уведомления, для хранения информации о подключивщихся к хабу, я использовал подход Хранение в памяти:
      public class NotificationHub:Hub
          {
      //хранилище подключений(тут я храню только администраторов)
              private readonly static ConnectionMapping<string> _connections = new ConnectionMapping<string>();
      
      //сейчас я вызываю этот метод с клиента, но его легко можно и вызвать на сервере, 
      //допустим в каком-нибудь методе контроллера, что я в последствии и собираюсь сделать,
      //потому что мне надо, чтобы при добавлении новости уведомления получал только администратор или модератор
              public void Send(string message)
              {
      
                  var user = Context.User;
      //получаем всех подключенных админов и каждому отправляем уведомление
                  foreach (var connectionId in _connections.GetConnections())
                  {
      //если это сам админ то не надо отправлять
                      if (!user.IsAdmin())
                      {
      //тут мы вызываем метод на клиенте, который и отобразит наше уведомление
                          Clients.Client(connectionId).sendNotification(message);
                      }
                  }
              }
      
              public override Task OnConnected()
              {
      //Хаб имеет доступ к контексту + я использую Identity (ссылку дал выше читайте), следовательно могу получить доступ к информации о подключенном пользователе:
                  var user = Context.User;
      
                  if (user.IsAdmin())
                  {
                      string userId = Context.User.GetUserId();
      //запихиваем нашего подключенного пользователя если он админ в хранилище подключений, кстати каждому подключившемуся выдается ConnectionId, который можно получить из контекста и да он уникален и выдается каждый раз новый при подключении
                      _connections.Add(userId, Context.ConnectionId);
                  }
                  return base.OnConnected();
              }
      
              public override Task OnDisconnected(bool stopCalled)
              {
                  var user = Context.User;
      
                  if (user.IsAdmin())
                  {
                      string userId = user.GetUserId();
      //если пользователь(админ) отключился, то убираем его из хранилища
                      _connections.Remove(userId, Context.ConnectionId);
                  }
      
                  return base.OnDisconnected(stopCalled);
              }
      
              public override Task OnReconnected()
              {
                  var user = Context.User;
      
                  if (user.IsAdmin())
                  {
                      string userId = user.GetUserId();
      
                      if (!_connections.GetConnections(userId).Contains(Context.ConnectionId))
                      {
                          _connections.Add(userId, Context.ConnectionId);
                      }
                  }
      
                  return base.OnReconnected();
              }
          }
      
      //на всякий случай добавлю класс хранилища подключений, но он такой же как в документации
      public class ConnectionMapping<T>
          {
              private readonly Dictionary<T, HashSet<string>> _connections = new Dictionary<T, HashSet<string>>();
      
              public int Count
              {
                  get
                  {
                      return _connections.Count;
                  }
              }
      
              public void Add(T key, string connectionId)
              {
                  lock (_connections)
                  {
                      HashSet<string> connections;
                      if (!_connections.TryGetValue(key, out connections))
                      {
                          connections = new HashSet<string>();
                          _connections.Add(key, connections);
                      }
      
                      lock (connections)
                      {
                          connections.Add(connectionId);
                      }
                  }
              }
      
              public IEnumerable<string> GetConnections(T key)
              {
                  HashSet<string> connections;
                  if (_connections.TryGetValue(key, out connections))
                  {
                      return connections;
                  }
      
                  return Enumerable.Empty<string>();
              }
      //добавил только вот этот метод для получения всех подключивщихся администраторов
              public IEnumerable<string> GetConnections()
              {
                  HashSet<string> connections = new HashSet<string>();
      
                  if (_connections.Any())
                  {
                      foreach (var connection in _connections)
                      {
                          foreach (var connectionId in connection.Value)
                          {
                              connections.Add(connectionId);
                          }
                      }
                  }
      
                  return connections;
              }
      
              public void Remove(T key, string connectionId)
              {
                  lock (_connections)
                  {
                      HashSet<string> connections;
                      if (!_connections.TryGetValue(key, out connections))
                      {
                          return;
                      }
      
                      lock (connections)
                      {
                          connections.Remove(connectionId);
      
                          if (connections.Count == 0)
                          {
                              _connections.Remove(key);
                          }
                      }
                  }
              }
          }


    8. Ну и собственно все. У меня работает, при клике на тестовую кнопку всем админам высылается уведомление. Всем добра и хорошего дня;
    Ответ написан
    Комментировать
  • Как адаптировать карусель bootstrap?

    Можете попробовать поместить картинку, как background-image. И задать свойства background-size: cover;
    Ответ написан
    Комментировать
  • Как стилизовать select средствами bootstrap?

    Хочу добавить, что для удобства можно еще использовать Bootstrap-chosen либо Bootstrap-select. Стили можно, потом причесать ручками.
    Ответ написан
    Комментировать
  • Как спрятать элемент, при нажатии на другой, с помощью jQuery?

    $("#show_phone").click(function(){
          $('#show_phone_cont').show(function(){
            $('#show_geo_cont').hide();
          });
        });
    
        $("#show_geo").click(function(){
          $('#show_geo_cont').show(function(){
            $('#show_phone_cont').hide(function(){
            });
          });
        });
    Ответ написан