我需要精确指定GWT排列并控制其中的变化(每个变量支持的属性值的组合),但很难找到详细的行为规范。
在我的实验过程中,我了解到我必须注意创建set-property ... when-property-is循环,即使这些循环是“稳定的” - 即它们不会改变循环的任何部分,只是“确认它。这限制了我能做的事情,所以我决定尝试另一种方式 - 定义一个全新的属性,(仅)例如:
<define-property name="precise.permutation" values="webkit,gecko,ie,unsupported"/>
......然后有类似的东西:
<set-property name="precise.permutation" value="webkit">
<!-- ... custom conditions ... -->
</set-property>
<set-property name="precise.permutation" value="gecko">
<!-- ... custom conditions ... -->
</set-property>
<set-property name="precise.permutation" value="ie">
<!-- ... custom conditions ... -->
</set>
<set-property name="precise.permutation" value="unsupported">
<!-- ... custom conditions ... -->
</set-property>
...然后我尝试将此限制为所有但不受支持的用作示例,但完全违反直觉,因为它使用与上面相同的set-property标记:
<set-property name="precise.permutation" value="webkit,gecko,ie" />
我还必须折叠其他属性以确保它们不会导致其他排列。
不幸的是,这似乎没有按预期工作(尝试使用GWT 2.8 RC2)。尽管“不支持的”排列没有出现(这是期望的),但是来自它的属性的组合再次出现在其他排列中(这是不期望的)。
有人可以帮我找到权威的和完整的文档或帮我解决这个问题吗?
谢谢!
答案 0 :(得分:1)
我仍然没有找到详细的文件,但我做了大量的实验并得出以下结论......
(注意:我的例子使用了我开发的Sencha GXT的一些概念)
&LT;限定-性&gt;用于定义属性及其可能的值,但不是实际使用的值的最后一个词。在* .gwt.xml文件的层次结构中,每个属性应该只有一个这样的定义。
&LT;设置性&gt;不会将属性设置为A值,而是创建一种规则,其中包含该属性的可能值的COLLECTION(理想情况下为&amp; ltdefine-property&gt;中定义的子集)。 &lt; set-property&gt;的最后一个声明对于给定的财产获胜。小心!如果您使用&lt; set-property&gt;在&lt; inherits&gt;之后(继承模块),您可能/将覆盖您继承的任何规则。请注意,有条件规则和无条件规则。例如,
<set-property name="gxt.user.agent" value="ie10, ie11, gecko1_9, safari5, chrome"/>
...将无条件地声明,在确定排列时,属性&gt; gxt.user.agent&#39;可以具有任何一个列出的值。相反,
<set-property name="user.agent" value="safari">
<any>
<when-property-is name="gxt.user.agent" value="safari5" />
<when-property-is name="gxt.user.agent" value="chrome" />
</any>
</set-property>
将声明user.agent只能是&#34; safari&#34;当&#34; gxt.user.agent&#34;是&#34; safari5&#34;或&#34; chrome&#34;。顺序似乎很重要,因此您需要在依赖关系规则之后声明的依赖属性的规则。循环依赖将无法编译。您可以创建许多条件规则,只要它们不互相矛盾。我不知道如果他们这样做会发生什么,但我想最后宣布会赢。
请注意,条件规则还可以指定多个可能的值。例如(仅供参考,可能与您的需求不符):
<!-- On desktops we do all browsers including IE -->
<set-property name="gxt.user.agent" value="safari5, chrome, gecko1_9, ie11">
<when-property-is name="gxt.device" value="desktop" />
</set-property>
<!-- ... but on tablets and phones we exclude IE -->
<set-property name="gxt.user.agent" value="safari5, chrome, gecko1_9">
<any>
<when-property-is name="gxt.device" value="tablet" />
<when-property-is name="gxt.device" value="phone" />
</any>
</set-property>
您可以使用&lt; any&gt;和&lt; all&gt;创建复杂/复合标准。这些可以互相嵌套。
如何使用它来精确控制排列?你可能不需要这个,但它帮助我开始定义这样的两个属性:
<define-property name="custom.use.case" values="case1, case2, ..."/>
<property-provider name="helix.product.mode"><![CDATA[
var useCase = ...; // JavaScript code to determine the use case
return useCase;
]]>
</property-provider>
<define-property name="custom.permutation" values="perm1, perm2, ..."/>
第一个属性定义用例。上面我有办法在运行时确定它。你可能没有,可能会跳过它。它还可以作为定义其他所有内容的起点,因为我们可以根据用例定义所有其他属性。例如:
<!-- Case 1 restrictions -->
<set-property name="gxt.device" value="desktop">
<when-property-is name="custom.use.case" value="case1" />
</set-property>
<set-property name="gxt.user.agent" value="chrome, safari5, gecko1_9, ie11">
<when-property-is name="custom.use.case" value="case1" />
</set-property>
...
<!-- Case 2 restrictions -->
<set-property name="gxt.device" value="tablet, phone">
<when-property-is name="custom.use.case" value="case2" />
</set-property>
<set-property name="gxt.user.agent" value="chrome, safari5, gecko1_9">
<when-property-is name="custom.use.case" value="case2" />
</set-property>
...
<!-- Case 3 restrictions -->
<set-property name="gxt.device" value="tablet, phone">
<when-property-is name="custom.use.case" value="case3" />
</set-property>
<set-property name="gxt.user.agent" value="safari5">
<when-property-is name="custom.use.case" value="case3" />
</set-property>
...
etc.
接下来要做的是将所有属性除以用于custom.permutation,因为我们只希望custom.permutation来驱动排列:
<collapse-property name="custom.use.case" values="*" />
<collapse-property name="gxt.device" values="*" />
<collapse-property name="gxt.user.agent" values="*" />
<collapse-property name="user.agent" values="*" />
<collapse-property name="user.agent.os" values="*" />
这种方法可以对#34;排列进行极其精细的控制。和他们的内部复杂性,&#34;软排列&#34;有人称之为。对于每种可能的&#34; custom.permutation&#34;将会有一个排列。适当的价值。每个排列只会有所需的软排列&#34;如果你做好了上述规则的制定,就可以了。
请注意,实际和软排列都要花费。具有许多软排列(分组为实际排列与否)会导致编译性能和它们被分组的排列的运行时代码大小。不要忽略这一点,特别是如果您有许多属性。实际排列具有更高的编译和链接时间成本(但是与将多个软排列组合成分组的实际排列相比,具有更多的排列会减少每个排列的大小)。
如果使用GXT,从版本4开始,您会注意到它添加了具有桌面,平板电脑和手机等值的gxt.device属性。这导致我们的编译时间在升级到GXT 4后增加了大约6-7倍,因为我们的排列失控。最后,有些人为Mac OS平板电脑上运行的Internet Explorer做了很多工作。您可以理解对于不存在的用例而言浪费时间排列是多少。通过实现上述功能,我们能够将GWT编译时间缩短到原始时间的一半左右,或者比GXT 4升级后的速度快10-12倍。