On Fri, Jan 5, 2018 at 7:19 PM, Pratik Patel <pra...@semandex.net> wrote:
> Hello all, > Hello! Short answer: there's no built-in way of having just one page having one infrastructure which is different from the others. Something you can try to do is to write a MarkupRendererFilter which removes the <script> elements added by Tapestry if the requested page is the one you want with Angular and contribute it with the "after:*" constraint to the MarkupRenderer service. If it doesn't work, try with "before:*". For finding script elements, I recommend the tapestry-xpath library, which allows you to query Tapestry DOM elements using XPath. The contribution part, a method which would be included in your AppModule, would look like this: public void contributeMarkupRenderer( final OrderedConfiguration<MarkupRendererFilter> config) { config.addInstance("SpecificPageJSRemoverMarkupRendererFilter", SpecificPageJSRemoverMarkupRendererFilter.class, "after:*"); } And the MarkupRendererFilter implentation: public class SpecificPageJSRemoverMarkupRendererFilter implements MarkupRendererFilter { public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) { renderer.renderMarkup(writer); if (thisIsTheSpecialPage) { Document document = writer.getDocumet(); // This is the rendered HTML in the form of a tree of Element instances // Use tapestry-xpath to find the <script> elements // call element.remove() on them. } } } Please let me know whether this works. > > I have a tapestry application to which I want to add some distribution > generated from an Angular app. So far, I am able to use Angular > distribution in a .tml page and the page is rendered fine. > > Now, I want to add an existing tapestry component (a layout) to this new > page. The problem is that when I add this component, I start getting errors > because of conflict between Angular and prototype.js. They both have > "bind()" method and the method from prototype.js "wins" over the other one > and I get an error from Angular's js code which tries to use bind() method. > > As such, I am not using any prototype.js functionality in my new page but > still the prototype library is loaded as it is part of tapestry core. I am > thinking that disabling prototype on this new page would avoid conflict. > After lot of exploration I found that I can probably > use JAVASCRIPT_INFRASTRUCTURE_PROVIDER as mentioned here > http://tapestry.apache.org/current/apidocs/org/apache/ > tapestry5/SymbolConstants.html#JAVASCRIPT_INFRASTRUCTURE_PROVIDER > > This will allow me to switch from prototype to jQuery. However, I want to > apply this change only on one page. Other pages of the app should still be > using prototype.js. Is that possible to achieve? Is it possible to have > more than one JavaScriptModuleConfigurations ( > http://tapestry.apache.org/current/apidocs/org/apache/ > tapestry5/services/javascript/JavaScriptModuleConfiguration.html > ) > and then apply them selectively so that one page has configuration without > prototype and all others have the one with prototype? I am using tapestry > 5.3.8 and I can upgrade to 5.4.x if it is possible to achieve what is > mentioned above? > > Or is there any other way to achieve this? Is it possible to somehow > prevent prototype from being loaded for a specific tapestry page? I would > really appreciate any help on this issue as it is very crucial for us. > > Thanks, > Pratik > -- Thiago