2013-04-19 4 views
4

여기에는 다트 패키지가 없으므로 Javascript interop을 사용하고 있습니다. 그것은에 실패한 것Dart가 포함 된 크롬 패키지 앱에서 파일 선택기를 여는 방법

js.scoped(() { 
    done(entry) { 
     print('ok'); 
    } 
    js.context.doneCallback = new js.Callback.once(done); 
    js.context.chrome.fileSystem.chooseEntry(null, js.context.doneCallback); 
    }); 

:

Uncaught Error: Invocation of form fileSystem.chooseEntry(object, object) doesn't match definition fileSystem.chooseEntry(optional object options, function callback)

그래서 잘못된 유형이기 때문에 콜백이 거부되고있는 것 같다 이것은 내가 지금까지있어 것입니다.

아이디어가 있으십니까?

chrome.fileSystem docs 편집 : 옵션 매개 변수를 null로 다시 변경했습니다 (아래 Damien의 제안도 시도 함).

편집 :이 코드는 작동합니다 - 감사합니다 Damien!

js.scoped(() { 
    done(entry) { print('ok'); } 
    js.context.chrome.fileSystem.chooseEntry(null, new js.Callback.once(done)); 
    }); 

Edit2가 : Updated code 파일 선택기를 열고 그것에서 경로를 읽습니다. 그러나 js_interop 통해 자바 스크립트 FileReader 개체를 사용하는 방법을 잘 모르겠습니다.

편집 3 : Dart 메일 링리스트의 discussion을 참조하십시오.

답변

3

However I'm not sure how to use a javascript FileReader object via js_interop.

내가 여기 당신과 유사한 예로,이에 매우 해키 솔루션을 구현했습니다 :

https://gist.github.com/rmsmith/5878583

나는이 문제를 접근 한 방법은에 존재하는 유형의 암시 적 인터페이스 (파일, FileEntry,을 FileReader)를 구현하는 것입니다. 내가 필요로 할 때까지 많은 방법으로 UnimplementedError을 던졌습니다.

요점의 문제는 readAsText(blob, label)의 인스턴스를 자신의 FileEntry 유형으로 호출했지만 Blob 또는 File을 전달해야한다는 것이 었습니다. FileReader이 js이므로 실제로 js.Proxy가 Blob 또는 File이되어야합니다.

+0

잘 했어! 감사. –

2

같아요 {} chooseEntry이 기대지도를 작성하지 않고 당신이 그런 식으로, js.map 사용할 필요가 :

chrome.fileSystem.chooseEntry(js.map({'type': 'openWritableFile'}), 
    js.context.doneCallback); 

을하지만, 나는에 실제 파일 경로를 얻을 수 없었다 디스크 (이 파일 내용을 얻을 수 있지만 경로는 가상 파일 시스템에 있음).

편집 : 나는 실제로 그렇게, 두 번째 매개 변수로 함수를 사용하고 있습니다 :

chrome.fileSystem.chooseEntry(js.map({'type': 'openWritableFile'}), 
    new js.Callback.once((var fileEntry) { 
    print('fullPath: ' + fileEntry.fullPath); 
})); 
+0

이 방법은 선택기를 여는 것으로 생각됩니다. 사용자가 파일을 선택하고 내용을 읽을 수 있기를 바랍니다. 나는 경로명에 관심이 없다. 또한 docs는 첫 번째 인수가 선택 사항이라고 말하고 몇 가지 옵션을 가지고 놀았습니다. null은 작동해야합니다. 나는이 함수가 타입 함수가되어야하는 두 번째 인자에서 실패하고 있다고 생각하지만, 어떤 이유로 객체가 전달되고있다. http://developer.chrome.com/apps/fileSystem.html 제안을 주셔서 감사합니다;) –

+0

맞아요, 실제로 두 번째 매개 변수로 함수를 사용하고있었습니다. 그래도 첫 번째 문제와 같은 문제가 있었음을 기억합니다. 또한 선택적 매개 변수가 문제를 일으키는 이유를 이해하지 못했습니다. – Damien

+0

Yup - 생성자 호출을 인라이닝하여 기괴함을 수정합니다. js.context는 객체에 함수를 래핑해야합니다. –

관련 문제