Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Не работает VK.api из дочернего фильма. (http://www.flasher.ru/forum/showthread.php?t=156843)

Сeргей 27.05.2011 16:32

Не работает VK.api из дочернего фильма.
 
Проблема в следующем: есть фильм-папа, который запрашивает права у пользователя, добавляет приложение. Потом после выполнения всех условий, начинает загрузку дочернего фильма. В дочернем фильме идет обращение к VK.api. Например, friends.get. Функция не работает. Если вместо фильма-папы загрузить дочерний фильм, функция работает исправно.
В чем проблема?
Может неправильное обращение к VK.api в дочернем фильме?

Примеры кода:
Фильм-папа:
Код AS3:

import vk.APIConnection;
import vk.events.*;
var flashVars: Object = stage.loaderInfo.parameters as Object;
var VK: APIConnection = new APIConnection(flashVars);
a1.visible = false;
VK.addEventListener("onApplicationAdded", onApplicationAdded);
function onApplicationAdded(e:CustomEvent):void {
        VK.callMethod("showSettingsBox", 1030);
        a1.visible = true;
}
if (flashVars.is_app_user == 1) {
        if (!(flashVars.api_settings & 2) || !(flashVars.api_settings & 4) || !(flashVars.api_settings & 1024)) {
                VK.callMethod("showSettingsBox", 1030);
                a1.visible = true;
        } else {
                var loader:Loader = new Loader();
                var url:URLRequest = new URLRequest("http://cs10344.vkontakte.ru/u2932426/602e43ed452aa9.zip");
                loader.load(url);
                addChild(loader);
        }
}
if (flashVars.is_app_user == 0) {
        VK.callMethod("showInstallBox");
}
a1.addEventListener(MouseEvent.CLICK, click_);
function click_(evt:MouseEvent) {
        VK.callMethod("showSettingsBox", 1030);
}


Дочерний фильм:
Код AS3:

import vk.APIConnection;
var flashVars:Object=stage.loaderInfo.parameters as Object;
var VK:APIConnection=new APIConnection(flashVars);
VK.api("friends.get", {uid:flashVars.viewer_id}, Friends, FriendsErr);
function Friends(response:Object) {
        function getLength(o:Object):uint {
                var len:uint = 0;
                for (var item:* in o) {
                        if (item != "mx_internal_uid") {
                                len++;
                        }
                }
                return len;
        }
        var func =getLength(response);
        var text_:TextField=new TextField();
        text_.text = "У вас "+func " друзей";
        addChild(text_);
}
function FriendsErr(response:Object) {
        var text_:TextField=new TextField();
          text_.width = 300;
        text_.text = "Ошибочка вышла. Попробуйте еще разок!";
        addChild(text_);
}


carrotoff 27.05.2011 16:56

Код AS3:

var flashVars:Object=stage.loaderInfo.parameters as Object;

в дочернем - эта конструкция скорее всего дает null.
Дождитесь добавления дочернего клипа на сцену (слушайте ADDED_TO_STAGE), а потому обращайтесь к stage

Сeргей 27.05.2011 17:36

Цитата:

Сообщение от carrotoff (Сообщение 999259)
Код AS3:

var flashVars:Object=stage.loaderInfo.parameters as Object;

в дочернем - эта конструкция скорее всего дает null.
Дождитесь добавления дочернего клипа на сцену (слушайте ADDED_TO_STAGE), а потому обращайтесь к stage

А как обращаться?
Вот так?
Код AS3:

stage.addEventListener(Event.ADDED_TO_STAGE, addtostage);
function addtostage(e:Event){
        var flashVars: Object = stage.loaderInfo.parameters as Object;
        if(flashVars){
                addChild(flashVars);
        }
}


goodguy 27.05.2011 20:27

Сeргей, flashVars - это не DisplayObject. Добавить их в дисплей лист невозможно.

Вообще, вот такая конструкция:
Код AS3:

loader.load(url);
addChild(loader);

- далеко не лучший стиль написания кодов. Лучше добавить к объекту contentLoaderInfo загрузчика слушатель Event.COMPLETE
и уже по завершению загрузки добавлять контент на сцену
Код AS3:

stage.addChild(e.target.content as DisplayObject);

После этого объект точно сможет обращаться к свойствам stage

carrotoff 27.05.2011 23:27

Цитата:

Лучше добавить к объекту contentLoaderInfo загрузчика слушатель Event.COMPLETE
и уже по завершению загрузки добавлять контент на сцену
Код AS3:

stage.addChild(e.target.content as DisplayObject);

Цитата:

После этого объект точно сможет обращаться к свойствам stage
Кстати, не факт. Если обращение к stage в дочерней флешке будет происходить в конструкторе, то ничего не выйдет, поскольку конструктор сработает раньше (Event.INIT) загрузки самой флешки (Event.COMPLETE) и соответственно добавления ее на сцену. Потому для загружаемой флешки, пока не наступит ADDED_TO_STAGE, stage = null

Сeргей 28.05.2011 00:16

Большое спасибо всем ответившим, буду вникать.

goodguy 28.05.2011 10:02

Цитата:

Кстати, не факт.
Не просто не факт, а точно не сможет из конструктора. Но об этом уже сказали выше. Я только предложил другой способ добавления =)

Сeргей 28.05.2011 18:31

Попробовал вот так:
Код AS3:

var loader:Loader = new Loader();
                var url:URLRequest = new URLRequest("http://cs10344.vkontakte.ru/u2932426/72d6f7f11437ed.zip");
                loader.load(url);
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loading);
                function loading(e:Event) {
                        stage.addChild(e.target.content as DisplayObject);
                }

Ничего не получилось.
Пишу не в классе, а во fla файле.
В чем ошибка?

goodguy 28.05.2011 18:40

Нужно поменять эти строчки местами:
Код AS3:

loader.load(url);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loading);

Сначала добавляем слушатель, а потом уже грузим.

Но проблема скорее всего не в этом, а в том, что флешке не известен формат загружаемого файла. Что это вообще? Я его скачал, но открыть не могу

Сeргей 28.05.2011 18:49

Спасибо, сейчас попробую.
Если вы об этом http://cs10344.vkontakte.ru/u2932426/72d6f7f11437ed.zip - то все очень просто. В настройках есть пункт "Дополнительные swf-файлы". Как я понимаю, туда нужно загружать файлы в формате swf, которые будут в дальнейшем использоваться в приложении. Сайт как-то меняет расширение, и в итоге получается формат zip.
Пока не хочу использовать сторонний сервер для хранения swf, так как не уверен, пойдет у меня дело со флешем или нет.

Добавлено через 40 минут
Поменял местами, все равно не работает.
По ходу дело в формате.
Код AS3:

var loader:Loader = new Loader();
                var url:URLRequest = new URLRequest("http://cs10344.vkontakte.ru/u2932426/72d6f7f11437ed.zip");
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loading);
                loader.load(url);
                function loading(e:Event) {
                        stage.addChild(e.target.content as DisplayObject);
                }



Часовой пояс GMT +4, время: 02:56.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.