2013-02-08 2 views
2

Ember에 대한 속성 관찰자와 몇 가지 비정상적인 행동이 발생합니다. 행동의 코드에 대해이 jfiddle를 참조하십시오 : 두 속성을 동시에 업데이트 될 때Ember.js 속성 관찰자 비정상적인 행동

  1. 관찰자는 두 가지 속성을 시계 http://jsfiddle.net/sBVtJ/3/, 그것은 두 번 발사됩니다.
  2. 관측자가 컨트롤러에 다른 경로를 설정하면 해당 관측자가 활성 (예상) 될 때까지 시작되지 않습니다. 그러나 그 길을 떠날 때, 관찰자는 계속해서 발사 할 것입니다.

더 많은 토론 2 : 앱을 처음로드 할 때 "여러 속성 변경 작업"을 클릭하면 속성이 증가하기 시작합니다. 그러나 관찰자는 해고되지 않습니다. 이제 관찰자 경로로 이동하십시오. 속성을 증가 시키면 관찰자가 시작됩니다. 그런 다음 색인 경로로 다시 이동하십시오. 관찰자는 재산 증가에 대해 계속해서 사격 할 것입니다. 이제 특성이 두 경로 중 하나에서 증가 될 때마다 관찰자가 해고됩니다. 내 의도 된 동작은 관찰자 경로가 활성화 된 경우에만 관찰자를 시작하는 것입니다. 이것을 달성하기위한 어떤 방법이라도?

그리고 행동에 대한 나의 질문 1 : 관찰자는 속성이 업데이트 될 때마다 두 번 동시에 업데이트됩니다. 두 개의 속성을 동시에 업데이트하는 경우 관찰자에게 한 번만 발사 할 수 있습니까?

App = Ember.Application.create(); 

App.Router.map(function(){ 
    this.resource('observer'); 
}); 
App.Router.reopen({location:'none'}); 

App.ApplicationController = Ember.Controller.extend({ 
    consoleProp: function(){ 
     console.log(this.get('controllers.application.prop1')); 
    }, 
    changeTwoProperties: function(){ 
     this.get('controllers.application').incrementProperty('prop1'); 
     this.get('controllers.application').incrementProperty('prop2'); 
    }, 
    prop1:0, 
    prop2:0 
}); 

App.IndexController = Ember.Controller.extend({ 
    needs: ['application'], 
    changeTwoPropertiesBinding: 'controllers.application.changeTwoProperties', 
    consolePropBinding: 'controllers.application.consoleProp' 
}); 

App.ObserverController = Ember.Controller.extend({ 
    needs: ['application'], 
    changeTwoPropertiesBinding: 'controllers.application.changeTwoProperties', 
    consolePropBinding: 'controllers.application.consoleProp', 

    theObserver: function(){ 
     console.log('observer fired'); 
    }.observes('controllers.application.prop1', 'controllers.application.prop2') 
}); 

답변

1

제의 경우, Ember.beginPropertyChanges()Ember.endPropertyChanges()를 사용한다. 두 번째 행동에 대한 this SO answer for more info

Ember.beginPropertyChanges(); 
this.get('controllers.application').incrementProperty('prop1'); 
this.get('controllers.application').incrementProperty('prop2'); 
Ember.endPropertyChanges(); 

참조하십시오, 그것은 더 많은 연구가 필요합니다. 나는 옵서버 경로를 방문하기 전에 ObserverController이 생성되지 않았다고 생각하지만, 경로를 떠나면 파손되지 않습니다.

+0

시몬 : 비슷한 문제가 있습니다. 'Ember.run'과 통신하는 것을 포함하여 모든 것을 시도했지만 아무 소용이 없습니다. 'hasChanged' 메소드가 3 번 업데이트가 모두 끝난 후에 한 번만 실행된다면 좋을 것입니다 : http://jsfiddle.net/V29Nu/1/ – Wildhoney

+0

@Wildhoney 3 번에서 변경 사항을 관찰 할 수 있다고 생각하지 않습니다. 1) 하나의 변경으로 다른 컨트롤러. –