如何在定制器js api中立即应用值

时间:2017-02-21 作者:GusRuss89

我第一次使用定制程序,但遇到了一些麻烦,因为我在任何地方都找不到JS API的文档。

我正在尝试实现基于JS的自定义预览,除了只在更新控件中的值时应用更改之外,一切都很好。如果然后转到另一个页面(仍在customizer中),则在最后一个页面上应用的样式更新将消失,直到我以某种方式再次更改控件值(添加空格或其他任何内容以触发更改事件)。

这是我的customizer-preview.js

(function($) {

$(document).ready(function(){

    var customize = wp.customize,
        $customStylesheet = $(\'<style type="text/css"></style>\');

    // Custom css
    $customStylesheet.insertAfter($stylesheet); // Note I stripped out where $stylesheet is declared - this is not the cause
    customize( \'cf7md_options[custom_css]\', function( value ) {
        var func = function(newval) {
            $customStylesheet.text(newval);
        }
        value.call( customize, func );
        value.bind( func );
    } );        

});

}(jQuery));
这是基于customize_preview_init 行动

wp.customize( \'YOUR_SETTING_ID\', function( value ) {
    value.bind( function( newval ) {
        //Do stuff (newval variable contains your "new" setting data)
    } );
} );
value.call() (在我的代码中)是我试图func 在初始化时立即运行。这显然不起作用。

我应该如何在定制器的页面更改中保持控件中的更新?还有,我在什么地方没有找到实际的api引用吗?

1 个回复
最合适的回答,由SO网友:Weston Ruter 整理而成

由于您直接调用更改回调:

value.call( customize, func );
既然您没有传入值newval 将是undefined$customStylesheet.text(newval) 什么也做不了。

您需要像这样传入值:

value.call( customize, func, value.get() );
然而,最好重新利用现有的style 元素,该元素已由PHP输出,仅在更改设置时更新,而不是每次使用JS动态创建。

因此,您的PHP应该具有以下内容:

add_action( \'wp_head\', function() {
    $options = get_theme_mod( \'cf7md_options\' );
    echo \'<style id="cf7md-style">\';
    if ( isset( $options[\'custom_css\'] ) ) {
        echo strip_tags( $options[\'custom_css\'] );
    }
    echo \'</style>\';
}, 101 );
您的自定义预览JS可以简单地:

(function( $, api ) {
    api( \'cf7md_options[custom_css]\', function( setting ) {
        setting.bind( function onChange( value ) {
            $( \'#cf7md-style\' ).text( value );
        } );
    } );
}( jQuery, wp.customize ));

相关推荐