2013-10-09 5 views
0

У меня есть простая анимация, которая работает с использованием только JQuery:Jquery анимация прервана

jQuery(document).ready(function($) { 

    $('.right-block').on('click', 'chevron', function() { 
    if ($('.activity').hasClass('extended')) { 
     $('.activity').removeClass('extended').addClass('normal'); 
     $('.extended-block').slideUp(); 
     $('footer').fadeOut(); 
    } else { 
     $('.activity').addClass('extended').removeClass('normal'); 
     $('.extended-block').slideDown(); 
     $('footer').fadeIn(); 
    }  
    }); 

}); 

Вы можете увидеть его в действии, если вам нравится здесь: http://cdpn.io/3bfea533af106c9bb601626be55eb3c1

Когда я пытаюсь сделать то же самое в Ember хотя все становится немного забавным. Анимация начинается, она меняет направление, перезапускает и т. Д. Она часто заканчивается после многого и задерживается, но переход состояния не гарантируется, он может оказаться в том же состоянии, в котором вы начали.

My Ember Component выглядит так: :

App.ActivityWidgetComponent = Ember.Component.extend({ 

    actions: { 
     toggleWidgetState: function() { 
      var self = this; 
      this.$('.right-block').on('click', 'chevron', function() { 
       Ember.run.next(this, function() { 
        if (self.$('.activity').hasClass('extended')) { 
         self.$('.activity').removeClass('extended').addClass('normal'); 
         self.$('.extended-block').slideUp(); 
         self.$('footer').fadeOut(); 
        } else { 
         self.$('.activity').addClass('extended').removeClass('normal'); 
         self.$('.extended-block').slideDown(); 
         self.$('footer').fadeIn(); 
        }  
       }); 
      }); 
     } 
    } 

}); 

Мое подозрительное подозрение в том, что это имеет какое-то отношение к «темным искусствам». Вот почему вы видите, что моя попытка быть «сложной», добавив jQuery в следующий цикл цикла. Это изменение, похоже, немного улучшило поведение, но это определенно не решило его (и я не уверен, что это был шаг в правильном направлении).

Любая помощь приветствуется.

ответ

0

Ваша проблема заключается в том, что действие компонента просто добавляет прослушиватель событий jquery, который будет выполнять jquery-анимацию, а не запускать ее. Вы можете заменить компонент с этим:

App.ActivityWidgetComponent = Ember.Component.extend({ 

    actions: { 
     toggleWidgetState: function() {          
      if (this.$('.activity').hasClass('extended')) { 
       this.$('.activity').removeClass('extended').addClass('normal'); 
       this.$('.extended-block').slideUp(); 
       this.$('footer').fadeOut(); 
      } else { 
       this.$('.activity').addClass('extended').removeClass('normal'); 
       this.$('.extended-block').slideDown(); 
       this.$('footer').fadeIn(); 
      }         
     } 
    } 

}); 

И в шаблоне, вызвать это действие с помощью помощника action вида:

... 
    <div {{action "toggleWidgetState"}} class="right-block"> 
    <chevron>&nbsp; &nbsp;</chevron> 
    </div> 
    ... 

Это живой пример с этой рабочей http://jsfiddle.net/marciojunior/H9XYd/

+0

Ok, У меня уже было действие. Поэтому в основном вы говорите, что удалите событие jQuery click, потому что уже есть Ember. Делает здравый смысл. – ken

+0

Да. С помощью обычного jquery вы используете '$ (sel) .on ('click', handler)', но в ember вы будете использовать действия. Документация находится здесь http://emberjs.com/guides/templates/actions/ –

+0

Да, это имеет смысл, я просто не был достаточно осторожен. Я начинаю видеть вещи в свете Ember, но моя уверенность все еще не полностью там, поэтому я догадываюсь и не вижу вещей, которые я обычно делал. Я ожидаю, что это наполнится в течение следующих нескольких недель. В любом случае спасибо за помощь в получении правильного ответа. – ken

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