2013-04-17 3 views
0

내 emberjs 응용 프로그램에 데이터베이스 데이터가없는 모델이 있습니다. 내가 서버에서 일부 요청을 풀링하지만 컨트롤러 또는 뷰에 바인딩되지 않은 일부 개체를 원하기 때문에이 모델을 만들었습니다. 같은Emberjs 모델 내 SetTimeout

뭔가 : StatusChecker

을 내 Application.create 내부 내가 이런 식으로 할 수는 :

Webapp = Ember.Application.create({ 
    rootElement: '#content', 
    LOG_TRANSITIONS: true, 

    ready: function() { 
    return Webapp.status_helper = Webapp.StatusHelper.create({ 
     timer: 15 
    }); 
    } 
}); 

이 응용 프로그램에 대한 고유해야합니다 Webapp.StatusHelper 개체를 인스턴스화합니다. 내가이 객체에 init를 호출 할 때 나는 또한 기본 타이머를 사용하여 폴링을 시작합니다 $this.transitionToRoute('problem'); :

Webapp.StatusHelper = Ember.Object.extend({ 
    init: function(params) { 
    this.timer = this.get("timer"); 
    this.timeoutID = null; 
    this.controller = null; 
    this.start(); 
    }, 
    start: function() { 
    this.execute(); 
    }, 
    stop: function() { 
    clearTimeout(this.timeoutID); 
    }, 
    setTimer: function(newTime) { 
    this.stop(); 
    this.timer = newTime; 
    this.start(); 
    }, 
    execute: function() { 
    var $this = this; 
    this.stop(); 
    $.get("/status").done(function(data) { 
     console.log(data); 

     if (data["status"] === 0) { // Continue trying 
     $this.timeoutID = setTimeout(function() { 
      $this.execute(); 
     }, $this.timer * 1000); 
     } else if (data["status"] === 1) { // Go to a given controller 
     $this.setTimer(15); 
     $this.transitionToRoute('index'); // This doesn't work 
     } else { 
     $this.setTimer(15); 
     $this.transitionToRoute('problem'); // This doesn't work 
     } 
    }); 
    } 
}); 

첫 번째 문제는 내가이를 사용하여 모델에서 경로를 변경하지 못할 것입니다. 모델에서 그것을 할 수있는 방법이 있습니까?

두 번째 문제는 내가 컨트롤러에 들어가 때때로 때 내가 같이, 그 타이머를 중지하고 다른 간격을 시작해야 직후 StatusHelper의 간격을 지정할 필요가있다 :

Webapp.IndexRoute = Ember.Route.extend 
    setupController: (controller) -> 
    Webapp.status_helper.setTimer 15 

Webapp.ProblemRoute = Ember.Route.extend 
    setupController: (controller) -> 
    Webapp.status_helper.setTimer 1 

매 초마다 문제가 해결되었는지 확인해야하고 색인 페이지가 필요할 때마다 문제 페이지로 전환해야하기 때문에 이런 일이 발생합니다. 전환 후 나는 2, 그리고 때로는 더 많은 간격을 얻는다.

어떻게 멈추고 작동시킬 수있는 기능을 하나만 만들 수 있습니까?

P .: 모델을 변경할 필요가있는 경우 다른 것으로 변경할 수 있습니다.


TL;
  • DR

    어떻게 내부 제어기로부터의 경로를 변경할 수 있는가?
  • 어떻게 하나의 함수를 간격으로 실행할 수 있습니까?
  • 다른 (더 나은) 방법이 있습니까? 내 라이브러리의


편집

버전 : '($ this.transitionToRoute :

DEBUG: Ember.VERSION : 1.0.0-rc.1 ember.js:348 
DEBUG: Handlebars.VERSION : 1.0.0-rc.3 ember.js:348 
DEBUG: jQuery.VERSION : 1.9.1 

답변

2

첫 번째 문제는 내가이를 사용하여 모델에서 경로를 변경하지 못할 것입니다 문제');. 모델에서 그것을 할 수있는 방법이 있습니까?

모델에서 라우터에 액세스 할 수 없습니다. 그렇게 할 필요가있을 때마다 코드가 모델이되어서는 안된다는 단서가 있습니다. 이 경우에는 Webapp.StatusHelper이 정말로 컨트롤러 여야합니다. 그래서 같은 :

Webapp.StatusController = Ember.Controller.extend({ 
    //your code here 
}); 

그런 다음 당신은 초기화() App.ready() 후크 제거 할 수 대신 구성하고 타이머를 시작합니다 ApplicationRoute의 setupController 후크를 사용합니다.물론 컨트롤러에 연결되어 있으므로 라우터에 액세스 할 수 있습니다.

어떻게 멈추고 작동시킬 수 있습니까?

기본적으로 새 경로로 전환 할 때 타이머를 시작/중지해야합니다. 경로가 변경 될 때 타이머를 켜고 끄려면 경로 activate, deactivatesetupController 후크를 사용하십시오. 이렇게하면 타이머가 원할 때만 실행되도록 할 수 있습니다.

Webapp.IndexRoute = Ember.Route.extend 
  activate: (controller) -> 
    this.controllerFor('status').setTimer 15 
    this.controllerFor('status').start() 

  deactivate: (controller) -> 
    this.controllerFor('status').stop() 

Webapp.IndexRoute = Ember.Route.extend 
  activate: (controller) -> 
    this.controllerFor('status').setTimer 1 
    this.controllerFor('status').start() 

  deactivate: (controller) -> 
    this.controllerFor('status').stop() 
+0

내 접근 방식 (컨트롤러로''Webapp.StatusHelper'')에 내 문제는 우리가 한 페이지 /보기를 렌더링하는 컨트롤러를 2 개 가질 수 없다는 것입니다. 전자 메일 페이지처럼 생각하면 2 페이지 (모든 전자 메일과 전자 메일)가 있습니다. 둘 다 나는 새 이메일을 확인하고 싶습니다. 하나는 5 초마다, 다른 하나는 25 초마다 필요합니다. 이것은 내가 원하는 것입니다. –

+0

OK 당신이 원하는 것이 합리적입니다. 그러나'Webapp.StatusController'가 이것을 지원합니다. "2 개의 컨트롤러에서 한 페이지 /보기를 렌더링 할 수 없습니다"라는 의미는 무엇입니까? Ember 컨테이너는 'Webapp.StatusHelper' 인스턴스가 하나만 존재하는지 확인합니다. 그런 다음 당신의 경로 setupController hook은'controllerFor ('status'). start (5)'와 같은 것을 할 것이고 hook을 비활성화 시키면'controllerFor ('status'). stop()'을 가질 것이다. 코드를 사용하여 내 대답 업데이트 ... –

+0

멋지게 일했습니다, 감사합니다 –