2016-05-01 10 views
2

Я пытаюсь использовать OmniFaces для отсрочки сценариев PrimeFaces, как видно из этого answer.Как отложить сценарии PrimeFaces.settings и клиентской стороны с помощью o: deferredScript

Но PrimeFaces вынести встроенный сценарий в голове, как это (сценарий украшен и прокомментирован мной):

<script type="text/javascript"> 
    if(window.PrimeFaces) { 
     // this line is always rendered in Development mode. 
     PrimeFaces.settings.projectStage='Development'; 
     // these lines are added if Client Side Validation is enabled. 
     PrimeFaces.settings.locale='pt_BR'; 
     PrimeFaces.settings.validateEmptyFields=true; 
     PrimeFaces.settings.considerEmptyStringNull=true; 
    } 
</script> 

При запуске приложения, я получаю некоторые JS ошибки (файл и ошибки):

validation.js.xhtml?ln=primefaces&v=5.3:1 
Uncaught TypeError: Cannot read property 'en_US' of undefined 

beanvalidation.js.xhtml?ln=primefaces&v=5.3:1 
Uncaught TypeError: Cannot read property 'en_US' of undefined 

produto.xhtml:2 
Uncaught TypeError: Cannot set property 'locale' of undefined 

Если я ставлю некоторые переменные в primefaces.deferred.js, как это:

if (!primeFacesLoaded) { 
    window.PrimeFaces = { 
     // variables added - begin 
     settings: { 
      projectStage: 'Development', 
      locale: 'pt_BR', 
      validateEmptyFields: true, 
      considerEmptyStringNull: true 
     }, 
     // variables added - end 
     ab: function() { 
      defer("ab", arguments); 
     }, 
     cw: function() { 
      defer("cw", arguments); 
     }, 
     focus: function() { 
      defer("focus", arguments); 
     } 
    }; 
} 

Два е Первые ошибки все же происходят, но третья ошибка уходит.

По-видимому, объект PrimeFaces JS не хватает следующими свойствами:

locales: { 
    // other values... 
    en_US: { 
     // other values... 
    } 
}, 
util: { 
    // other values... 
}, 

Итак, вопрос: Как правильно перенести эти свойства PrimeFaces сценария?

P.S: Версии: PrimeFaces 5.3, 2.3 OmniFaces, скумбриевидный гидролик сервер (GlassFish) 4.1.1.161

ответ

0

PrimeFaces.settings был введен после того, как была размещена the answer. В то же время ответ был обновлен, чтобы принять это во внимание. Обновленный сценарий:

DeferredPrimeFaces = function() { 
    var deferredPrimeFaces = {}; 
    var calls = []; 
    var settings = {}; 
    var primeFacesLoaded = !!window.PrimeFaces; 

    function defer(name, args) { 
     calls.push({ name: name, args: args }); 
    } 

    deferredPrimeFaces.begin = function() { 
     if (!primeFacesLoaded) { 
      settings = window.PrimeFaces.settings; 
      delete window.PrimeFaces; 
     } 
    }; 

    deferredPrimeFaces.apply = function() { 
     if (window.PrimeFaces) { 
      for (var i = 0; i < calls.length; i++) { 
       window.PrimeFaces[calls[i].name].apply(window.PrimeFaces, calls[i].args); 
      } 

      window.PrimeFaces.settings = settings; 
     } 

     delete window.DeferredPrimeFaces; 
    }; 

    if (!primeFacesLoaded) { 
     window.PrimeFaces = { 
      ab: function() { defer("ab", arguments); }, 
      cw: function() { defer("cw", arguments); }, 
      focus: function() { defer("focus", arguments); }, 
      settings: {} 
     }; 
    } 

    return deferredPrimeFaces; 
}(); 

В принципе, просто подготовить свойство, как пустой объект, скопируйте его во время begin, а затем установить его во время apply.

Как откладывая PrimeFaces validation.js и beanvalidation.js файлов, для этого требуется пользовательский визуализатор для <h:head> как PrimeFaces один на самом деле жёстко их вместо того, чтобы объявить их как @ResourceDependency. Вы можете найти конкретный пример в wiki of CombinedResourceHandler.

package com.example; 

import java.io.IOException; 

import javax.faces.application.ResourceDependencies; 
import javax.faces.application.ResourceDependency; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.render.Renderer; 

@ResourceDependencies({ 
    @ResourceDependency(library="primefaces-aristo", name="theme.css"), 
    @ResourceDependency(library="primefaces", name="primefaces.js"), // Only necessary when at least one validation JS files needs to be included. 
    @ResourceDependency(library="primefaces", name="validation/validation.js"), // Only necessary when you need <p:clientValidator>. 
    @ResourceDependency(library="primefaces", name="validation/beanvalidation.js") // Only necessary when you use JSR303 bean validation. 
}) 
public class HeadRenderer extends Renderer { 

    @Override 
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException { 
     context.getResponseWriter().startElement("head", component); 
    } 

    @Override 
    public void encodeChildren(FacesContext context, UIComponent component) throws IOException { 
     // NOOP. 
    } 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 
     for (UIComponent resource : context.getViewRoot().getComponentResources(context, "head")) { 
      resource.encodeAll(context); 
     } 

     context.getResponseWriter().endElement("head"); 
    } 

} 

Чтобы его запустить, зарегистрировать его как следует в faces-config.xml:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Output</component-family> 
     <renderer-type>javax.faces.Head</renderer-type> 
     <renderer-class>com.example.HeadRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

Используя этот сценарий, я до сих пор есть проблемы с локалью и UTIL переменных. Предложение: Чтобы избежать копирования многих переменных, что делать, если мы клонируем все окно .PrimeFaces объект с другой переменной, отложить ab, cw, функции фокусировки и восстановить объект позже? – julianomqs

+0

Я вижу, PrimeFaces имеет эти проверки, жестко закодированные. См. Обновленный ответ. – BalusC

+0

2 вопроса: 1) У меня есть 'scripts.js', который устанавливает значения' PrimeFaces.locales ['pt_BR'] '(в календарь). Должен ли я помещать этот скрипт между 'DeferredPrimeFaces.begin()' и 'DeferredPrimeFaces.apply()'? 2) Я должен указать сценарии для отсрочки на каждой странице, или я могу поместить их в шаблон? – julianomqs

 Смежные вопросы

  • Нет связанных вопросов^_^