Por que mx: estados têm ser problema resolvido para uma implementação do componente?
-
21-08-2019 - |
Pergunta
De vez em quando eu recebo um erro quando eu configurar estados em um arquivo MXML. O erro que recebo diz que mx: estados não poderia ser resolvido para uma implementação de componente
.Eu li, no seguinte URL, que este problema é causado por componentes estendendo - que de alguma forma joga fora a capacidade do compilador para mx resolve: estados. Eu não vejo por que isso deve ser o caso, mas eu não tenho qualquer resposta da minha própria. Eu também não pode necessariamente fazer este trabalho abordagem com todos os meus componentes prolongados.
http://life.neophi.com/danielr/2007/01 /could_not_resolve_to_a_compone.html
A solução que eu vim acima com é não usar qualquer namespace. Então, o meu código, em seguida, se parece com isso:
<states>...</states>
em vez de:
<mx:states>...</mx:states>
Fazendo esse estranho (pelo menos, para mim) é o fato de que as crianças da tag - - não tem esse problema. mx: estados não pode ser resolvido, mas o seu filho mx: Estado pode. E mx: SetProperty - uma criança de mx:. Estado - é também resolveu
Alguém pode explicar isso, e / ou oferecer uma solução melhor para o problema do que o que eu vim acima com?
A propósito, eu vejo o mesmo problema com mx:. Transições
Solução
Se você tem um componente personalizado, você provavelmente vai tê-lo em um espaço de nomes diferente de mx . Você está no caminho certo, removendo o espaço de nomes, mas você não tem que fazer isso. Considere o exemplo a seguir
<example:MyComponent xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:example="com.example.*">
</example:MyComponent>
Nesse código, temos um componente personalizado com o nome MyComponent no pacote com.example. Agora, como é que vamos adicionar estados personalizados? É fácil!
<example:MyComponent xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:example="com.example.*">
<example:states>
<mx:State name="CustomState">
</mx:State>
</example:states>
</example:MyComponent>
Propriedades de um componente, como estados , transições , ou mesmo rótulo em um botão pode ser criado como elementos filhos. Essas propriedades devem usar o mesmo namespace como a instância do componente. Não importa onde a propriedade vem na cadeia de herança. Mesmo se com.example.MyComponent estende mx.containers.Canvas, a propriedade estados usará o namespace XML no qual MyComponent está definido.
Em suma, não pensa em estados propriedade como mx: estados , pois o mx: prefixo de uma propriedade é meramente herdado a partir do componente. No entanto, temos de usar mx:. quando definimos o próprio estado real porque é uma classe (não uma propriedade) e essa classe é definida no mx namespace
Para ir um passo além na explicação, você pode alterar o http: // www. adobe.com/2006/mxml namespace para ser algo diferente de mx .
<zzz:VBox xmlns:zzz="http://www.adobe.com/2006/mxml">
<zzz:states>
</zzz:states>
</zzz:VBox>
Nesse exemplo, podemos mudar mx e zzz . Agora, a estados propriedade tem de ser prefixado com zzz: em vez de mx:.
Outras dicas
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%"
height="100%"
backgroundColor="#f7f7f7"
xmlns:common="com.americanexpress.voice.view.component.common.*">
<mx:states name="edit">
Por que isso falhar? Descobri também que esta falha quando eu tenho vários espaços de nomes definidos. Remover os endereços <mx:
a questão.