Flex- Singleton 的属性绑定到 HttpService 属性没有被更新

Posted

技术标签:

【中文标题】Flex- Singleton 的属性绑定到 HttpService 属性没有被更新【英文标题】:Flex- Singleton's properties Binded to HttpService properties are not being updated 【发布时间】:2013-11-23 20:12:59 【问题描述】:

我有以下单例:

package singletons

import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.SharedObject;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.registerClassAlias;


public class AppConfiguration extends EventDispatcher

    public static const SUCCESSFULCONFIGURATION:String = "ConfigurationSuccessful";
    public static const CONFIGURATIONERROR:String = "ConfigurationError";

    private var _userID:Number;     
    private var _serverIP:String;       
    private var _serverPort:Number;     
    private var _serverURL:String;
    private static var _instance:AppConfiguration; 


    public static function getInstance():AppConfiguration
    
        if (_instance == null) 
        
            _instance = new AppConfiguration();
            registerClassAlias( "singletons.AppConfiguration", AppConfiguration );
        

        return _instance;
           

    public function initialize():Boolean
               
        var configFile:SharedObject = SharedObject.getLocal("InternalConfiguration");


        if (configFile.data.internalConfiguration == null) 
                       
            return false;
                   

        var localConf:AppConfiguration =  AppConfiguration(configFile.data.internalConfiguration);
        _userID = localConf.UserID;
        _serverIP = localConf.ServerIP;
        _serverPort = localConf.ServerPort;
        _serverURL = "http://" + _serverIP + ":" + _serverPort;

        return true;        
    

    public function setInternalConfiguration(userID:Number, serverIP:String, serverPort:Number):void
    
        _userID = userID;
        _serverIP = serverIP;
        _serverPort = serverPort;
        _serverURL = "http://" + _serverIP + ":" + _serverPort;

        var configurationRequest:URLRequest = new URLRequest(_serverURL + "/getHello?userID=" + _userID);
        var requestLoader:URLLoader = new URLLoader();
        requestLoader.addEventListener(Event.COMPLETE, getConfigurationHandler);
        requestLoader.addEventListener(IOErrorEvent.IO_ERROR, getConfigurationErrorHandler);
        requestLoader.load(configurationRequest);
    

    private function getConfigurationHandler(event:Event):void
    
        // 1.2.- Asignar los valores de las variables obtenidas a las variables locales


        var configFile:SharedObject = SharedObject.getLocal("InternalConfiguration");
        configFile.data.internalConfiguration = this as AppConfiguration;
        configFile.flush();

        var successEvent:Event = new Event(SUCCESSFULCONFIGURATION);
        dispatchEvent(successEvent);            
    

    private function getConfigurationErrorHandler(event:IOErrorEvent):void
    
        var failedEvent:Event = new Event(CONFIGURATIONERROR);
        dispatchEvent(failedEvent);                 
    


    public function get UserID():Number 
               
        return _userID;
    

    public function get ServerIP():String 
               
        return _serverIP;
    

    public function get ServerPort():Number 
               
        return _serverPort;
           
    public function get ServerURL():String 
               
        return _serverURL;
           

当我尝试将两个单例的属性 ServerURL 和 UserID 绑定到我的 HTTPService 的属性 URL 和 Request 中时,这些值在修改后不会在 HTTPService 中更新。进行绑定的代码如下:

<fx:Declarations>
    <s:HTTPService id="getStatusService"
                   url="internalConfiguration.ServerURL/getObject"
                   result="getStatusHandler(event)" fault="getStatusErrorHandler(event)">
        <s:request>
            <codec>internalConfiguration.CodecID</codec>
        </s:request>
    </s:HTTPService>                    
</fx:Declarations>

当我执行 getStatusService.send() 时,它转到“null/getObject”。

有人知道为什么变量没有在 HTTPService 中更新吗?

感谢您的帮助。

塞巴斯蒂安

【问题讨论】:

【参考方案1】:

internalConfiguration.ServerURL 没有被更新,因为 initialize() 方法从未被调用(至少在你提供的代码中)。 ServerURL 字段默认为空,因此它在 httpservice 中为空。考虑到 ServerURL 应该是可绑定的。 ServerURL 也应该有 setter,否则绑定不会被触发。

别忘了配置也必须是可绑定的:

[Bindable]
private var internalConfiguration:AppConfiguration = AppConfiguration.getInstance();

【讨论】:

感谢 Daniil 的 cmets。我没有提到它,但initialize() 方法正在CreationComplete 调用。在调用 getConfigurationHandler(event:Event) 并更新所有值后,我检查了这些值。另外,我将internalConfiguration 声明为[Bindable]。我真的不明白这是为什么。如果您有更多想法,我将不胜感激。祝您度过愉快的一周! 就像我说的 ServerURL 应该有二传手。 ServerURL 的 getter 也应该是可绑定的。并且在初始化()方法调用 ServerURL 的设置器而不是私有字段 _serverURL 内部然后它将起作用。

以上是关于Flex- Singleton 的属性绑定到 HttpService 属性没有被更新的主要内容,如果未能解决你的问题,请参考以下文章

Flex 警告:无法绑定到类“Object”上的属性“foo”(类不是 IEventDispatcher)

Knockout JS 将元素的属性绑定到另一个元素

Flex:如何将 S:list 中的 Sqlist 查询绑定到 S:Textarea

无法绑定到“routerlink”,因为它不是使用 angular2-webpack-starter 的已知本机属性 [重复]

.NET之模型绑定和验证

Flex HttpService:附加到目的地