플래시 (실제로 Flex) 개체는 수정 된 버전의 embedCallAC_FL_RunContent.js 스크립트를 사용하여 업데이트 패널의 ASP.Net 페이지에 만들어 지므로 동적으로 작성할 수 있습니다. 이 스크립트는 해당 패널에 부분 포스트 백이있는 상태로 다시 작성됩니다. 페이지에는 다른 업데이트 패널도 있습니다.UpdatePanel에서 Flash Object에 대한 ExternalInterface 호출 대기 - 개선 필요
일부 포스트 백 (부분 및 전체)을 사용하면 $get('FlashObj').ExternalInterfaceFunc('arg1', 0, true);
과 같은 외부 인터페이스 호출이 서버 측에서 준비되며 ScriptManager.RegisterStartupScript를 사용하여 페이지에 추가됩니다. 함수에 포함되어 Sys.Application의로드 이벤트에 채워집니다 (예 : Sys.Application.add_load(funcContainingExternalInterfaceCalls)
).
문제는 각 부분 포스트 백과 함께 Flash 객체의 상태 상태가 변경 될 수 있기 때문에 JavaScript -> Flash External (외부) 인터페이스에서 Flash (Flex) 객체 및/또는 외부 인터페이스가 아직 준비되지 않았거나 DOM에 존재하지 않을 수 있습니다. 인터페이스 호출이 이루어진다. "개체가이 속성 또는 메서드을 지원하지 않습니다"라는 결과가 발생합니다.
Flash가 준비되어 있으면 즉시 ExternalInterface를 호출하거나 Flash에서 준비 상태가 될 때까지 기다리는 작업 전략이 있습니다.
//Called when the Flash object is initialized and can accept ExternalInterfaceCalls
var flashReady = false;
//Called by Flash when object is fully initialized
function setFlashReady() {
flashReady = true;
//Make any queued ExternalInterface calls, then dequeue
while (extIntQueue.length > 0)
(extIntQueue.shift())();
}
var extIntQueue = [];
function callExternalInterface(flashObjName, funcName, args) {
//reference to the wrapped ExternalInterface Call
var wrapped = extWrap(flashObjName, funcName, args);
//only procede with ExternalInterface call if the global flashReady variable has been set
if (flashReady) {
wrapped();
}
else {
//queue the function so when flashReady() is called next, the function is called and the aruments are passed.
extIntQueue.push(wrapped);
}
}
//bundle ExtInt call and hold variables in a closure
function extWrap(flashObjName, funcName, args) {
//put vars in closure
return function() {
var funcCall = '$get("' + flashObjName + '").' + funcName;
eval(funcCall).apply(this, args);
}
}
Flash (Flex) 객체가 포함 된 업데이트 패널을 업데이트 할 때마다 flashReady var을 dirty로 설정했습니다.
ScriptManager.RegisterClientScriptBlock(parentContainer, parentContainer.GetType(), "flashReady", "flashReady = false;", true);
나는 내가이 일을 가지고 있음을 기쁘게 생각하지만, 해킹 같은 느낌. 나는 "eval()"이 명백하게 악의가되는 이유와 관련하여 학습 곡선에있다. 그래서 나는 최선의 방법을 위반하고 있는지 또는이 코드를 개선해야하는지 궁금하다. 감사.