2014-06-06 4 views
0

몇 시간이 걸리는 작업이 있으며 로딩 스피너를 표시하여 사용자에게 표시하지 않아도됩니다. 나는 로딩 스피너가 표시되기 전에 가끔 이상 실행 행위에 직접 트리거 것을 깨달았다 알고 : 내가 50ms의로의 전환을 지연하여이를 달성하기 위해 노력긴 작업을 수행하기 전에 템플리트를 강제로 동기화하십시오.

 this.set('betRound.isLoading', true); 
     var _this = this; 
     Ember.run.sync(); 
     Ember.run.later(function(){ 
      _this.transitionToRoute('betround.edit', _this.get('betRound.content')); 
     }, 50); 

있지만, 일부 느린 모바일 기기, 따라 로딩 스피너에 "isLoading"은 표시되지 않습니다.

+0

내장 된로드 메커니즘을 사용하지 않는 이유가 있습니까? – Kingpin2k

+0

당신은 모델 후크를 의미합니까? 또는 어떤 "기본 제공"기능을 참조하고 있습니까? 새로운 경로가 준비 될 때까지 이전 경로를 보여주고 싶지만 그 동안에는 회전 경로를 나타내려고합니다. 이 특별한 경우에 나는 로딩 서브 루트를 입력하고 싶지 않습니다. 왜냐하면 제가 할 수있는 한 오래된 서브 우퍼를 보여주고 싶기 때문입니다. – m0c

+0

로드 하위 경로를 언급하고 있습니다. 속도 저하는 페이지에 렌더링되는 템플릿 일뿐입니다. 맞습니까? – Kingpin2k

답변

0

콜백 메커니즘의 일종으로, 로딩 스피너를 뷰 또는 구성 요소에 넣고 DOM 준비가되면 컨트롤러에 알립니다. 다음은 믹싱의 예입니다. 모든 뷰 또는 구성 요소에 첨부하여로드 한 후 알림을 보낼 수 있습니다.

App.LoadAware = Ember.Mixin.create({ 
    didInsertElement: function() { 
    this._super(); 
    var target = this.get("loadedNoticeTarget"); 
    Ember.assert("We must have loadedNoticeTarget in LoadAware component or view", target); 
    target.send("loadAwareLoaded"); 
    } 
}); 

당신은 다음과 같이 적용합니다 :

App.LoadingSpinnerComponent = Ember.Component.extend(App.LoadAware); 

을 템플릿에서 : 다음

{{#if isLoading}} 
    {{loading-spinner loadedNoticeTarget=this}} 
{{/if}} 

와, 컨트롤러에서 :

App.IndexController = Ember.Controller.extend({ 
    actions: { 
    goToSlowRoute: function() { 
     this.set("_waitingForSpinner", true); 
     this.set("isLoading", true); 
    }, 
    loadAwareLoaded: function() { 
     Ember.assert("We must be waiting on spinner at this point", this.get("_waitingForSpinner")); 
     this.set("_waitingForSpinner", false); 
     this.transitionToRoute("slowRoute"); 
    } 
    }, 
    isLoading: false 
}); 

을이 예에서 , sendi로 전환을 시작합니다. 컨트롤러에 goToSlowRoute 메시지를 보냅니다. 전체 JSBin here.

+0

이것이 작동하는 것 같지만 전환이 발생하지 않는다고 무작위로 경험합니다. 어설트 조건이 충족되지 않았기 때문에 어쩌면? _waitingForSpinner가 필요한 이유를 완전히 이해하지는 못했지만. isLoading에 종속 된 것으로 렌더링 할 것이므로 loadAwareLoaded는 렌더링되는 즉시 트리거됩니다. – m0c

+0

네가 그렇다면'_waitingForSpinner'을 제거하고'isLoading' 만 사용할 수 있습니다. 전자는 일반적인 패턴으로, 스피너를 다른 것으로 호출하려는 경우 유용합니다. 어설 션이 실패했는지 확인하려면 콘솔을 점검하십시오. – panta82

관련 문제