Jsf 如何使用o:deferredScript延迟PrimeFaces.settings和客户端验证脚本
我试图使用OmniFaces来延迟PrimeFaces脚本,如图所示 但是PrimeFaces在头部呈现一个内联脚本,如下所示(我对脚本进行了美化和注释): 如果我在Jsf 如何使用o:deferredScript延迟PrimeFaces.settings和客户端验证脚本,jsf,primefaces,omnifaces,deferred-loading,Jsf,Primefaces,Omnifaces,Deferred Loading,我试图使用OmniFaces来延迟PrimeFaces脚本,如图所示 但是PrimeFaces在头部呈现一个内联脚本,如下所示(我对脚本进行了美化和注释): 如果我在primefaces.deferred.js中放入一些变量,如下所示: if (!primeFacesLoaded) { window.PrimeFaces = { // variables added - begin settings: { projectStage:
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脚本属性?
附言:版本:PrimeFaces 5.3、OmniFaces 2.3、Payara服务器(Glassfish)4.1.1.161PrimeFaces.settings在发布后引入。与此同时,为了考虑到这一点,对答案进行了更新。更新的脚本是:
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;
}();
要让它运行,请按如下方式在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>
javax.faces.Output
javax.faces.Head
com.example.headender
使用此脚本时,我仍然存在区域设置和util变量的问题。建议:为了避免复制许多变量,如果我们将整个window.PrimeFaces对象克隆到另一个变量,延迟ab、cw、focus函数并稍后恢复该对象,该怎么办?我明白了,PrimeFaces已将这些验证文件硬编码。请参阅更新的答案。2个问题:1)我有一个scripts.js
设置PrimeFaces.locales['pt\u BR']
值(到日历)。我应该将此脚本放在DeferrePrimeFaces.begin()
和DeferrePrimeFaces.apply()
之间吗?2) 我必须在每个页面中指定要延迟的脚本,或者我可以将它们放在模板中?非常感谢所有的答案。我可以问一下PrimeFaces和window.PrimeFaces的区别吗?因为我可以通过“window.PrimeFaces.settings”作为PrimeFaces访问设置。设置不起作用。在begin方法中,设置是未定义的,所以稍后我在进行验证时遇到了getLocaleSettings()方法的问题
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;
}();
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");
}
}
<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>