2011-02-26 4 views
1

편집 가능한 Ext 그리드 패널이 있습니다. 이 사용하는 저장소 레코드를 변경하는 기능을 발생시키는 수신기 가지고격자의 업데이트시 상점의 리스너 함수가 두 번 실행됩니다.

listeners:{ 
    update: someFunction 
    }, 

함수가 매장에서 어떤 값을 변경하므로 기능이 다시 발사된다. 함수를 한 번 실행하는 방법이 있습니까? 다른 수신기를 사용할 수 있습니까?

답변

2

I 상점의 값을 변경하고 함수의 시작 부분에

store.removeListener('update', someFunction); 

를 추가하여 달성했다 :

store.addListener('update', someFunction); 

을 결국.

아마도 더 좋은 방법이 있을까요?

1

ExtJS 저장소에는 모든 이벤트의 실행을 일시 중단하는 suspendEvents 메서드와 실행 이벤트를 다시 시작하는 resumeEvents 메서드가 있습니다. 나는 당신이 리스너를 제거하고 추가하는 대신에 그것들을 사용할 수 있다고 생각합니다. 그것은 제 의견으로는 좀 더 "깨끗한"접근 방법이 될 것입니다.

+0

나는 이유는 모르겠지만, 일시 중단 사용하는 경우 내가 사용하지만/그리드 이벤트를 수동으로 다시 해고 경우에만 업데이트됩니다 이벤트를 재개 : 여기

내 코드는 저장소에서 가져옵니다 suspendEvents (false)/ – lvil

1

이중 화재의 원인이 "저장소의 일부 값을 변경합니다"라는 메시지가 나타납니다.

EditGridPanel에서 A, B, C, D 열을 편집/변경할 수 있지만 A, C의 변경 사항은 E 열과 같은 "일부 값"에서 변경됩니다. 처리기 (someFunction)에서는 > 그것은 단지

2

ExtJS Store documentation 검사 추측 왜, 당신은 할 수 있습니다 - 형태 A를 오는 변화, B, C, 내가 코드를 모르는 D되지

... E에서하는 것이 무엇 된 SomeFuncion에 무슨 일이 생긴 확인 beforesave 이벤트 (강조 광산)에서 볼 수 있습니다 :

화재를 사 전에 행동이 호출됩니다. 저장은 레코드 삭제, 레코드 업데이트 및 레코드 생성을 포함합니다.

또는 당신이 사용할 수 ...

store.addListener('update', someFunction, store, {single: true}); 

은 ... 콜백 함수는 호출 된 다음에 update 일어난다 있음을 확인합니다.

+0

{single : true} 내가 필요한 것, 감사합니다! –

1

부울 옵션 단일을 사용하여 iit이 자동으로 제거되므로 모든 이벤트는 한 번만 실행될 수 있습니다. true.

// as config 
listeners: { 
    update: {fn: somefunc, single: true } 
} 
// with adListener()/on() 
cmp.on('update', myFunc, scope, { single: true }); 

을 그리고 했나요로 그냥 사용, 실행하는 항목을 많이 한 이벤트를 업데이트해야하는 경우이 구문은 내선 3/4

실제 솔루션을 작동합니다 : 그것을 acheive 할 때 사용 suspendEvents()은 이벤트 실행을 일시 중지하고 resumeEvents()은 일시 중지를 취소합니다. 마지막으로 fireEvent()을 사용하면됩니다.

2

동일한 문제가있었습니다 (Ext JS 4.1 사용). 두 컨트롤러 인스턴스 문제 (다른 사람에게 도움이 될 수도 있습니다, 여기에 설명되어 있습니다 : http://www.sencha.com/forum/showthread.php?179105-Store-loads-amp-duplicates-records-but-API-only-called-once)하지만 내가 확인한 후 하나의 컨트롤러 인스턴스가 다른 솔루션을 찾고있었습니다 확신했다.

nicolasbui 힌트를 완벽하게 나를 위해 작동합니다.

listeners: { 
    load: function(store, records, success, options) { 
     console.log("Store: load event."); 
    }, 
    scope: this, 
    single: true 
} 
관련 문제