【问题标题】:JQuery Deferred & cascading select boxesJQuery 延迟和级联选择框
【发布时间】:2018-02-08 13:13:41
【问题描述】:

在页面加载时,我正在尝试填充选择框。 #select2 的数据命中 URL 取决于 #select1 的值。由于第一个选择框也是从 Ajax 调用接收的数据中填充的,因此我无法提前知道页面加载时所选选项的内容。 initData() 在身体负荷时被调用。

我尝试了以下方法,但在 initData() selectOneValuenull 时调用 getSelectData('#select2', 'urlBase/' + selectOneValue + '/urlSuffix');

function initData() {
    initEnvs().then(function () {
        var selectOneValue= $('#select1').val();
        getSelectData('#select2', 'urlBase/' + selectOneValue + '/urlSuffix');
    });
}

function initEnvs() {
    return $.Deferred(function (def) {
        getSelectData('#select1', someUrl);
        def.resolve();
    }).promise();
}

function getSelectData(selectId, urlFragment) {
    $.ajax({
        type: "GET",
        url: "/data/" + urlFragment,
        dataType: "json",

        success: function (data) {
            appendSelectOptions(selectId, data);
        },
        error: function (xhr) {
            //handle error
        }
    });
}

我在这里做错了什么?

【问题讨论】:

    标签: javascript jquery jquery-deferred


    【解决方案1】:

    我没有对此进行测试,但这应该可以。如果没有,请告诉我。

    function initData() {
        initEnvs().then(function () {
            var selectOneValue= $('#select1').val();
            console.log("============ 2");
            getSelectData('#select2', 'urlBase/' + selectOneValue + '/urlSuffix').then(function(data){
              console.log("Are we here?");
              appendSelectOptions('#select2', data);
            });
        });
    }
    
    function initEnvs() {
        return $.Deferred(function (def) {
            getSelectData('#select1', someUrl).then(function(data){
                console.log(data);
                console.log("============");
                appendSelectOptions('#select1', data);
            });
            def.resolve();
        }).promise();
    }
    
    function getSelectData(selectId, urlFragment) {
        return $.Deferred(function (def) {      
          $.ajax({
            type: "GET",
            url: "/data/" + urlFragment,
            dataType: "json"
        });
         def.resolve();
       }).promise();   
    }
    
    initData();
    

    【讨论】:

    • 感谢您的回答,但 selectOneValue 在这些更改后仍然为空
    • 你在appendSelectOptions('#select1', data);做什么?你得到了什么data
    • 只创建<option> 并附加到选择框。数据只是一个字符串数组
    • 但是您不是将selected='selected' 分配给其中任何一个吗?设置默认值?检查console.log($('#select1 > option').length) 的长度它返回什么?可能是由于默认选择而没有返回值。或者可能是您的选择没有任何价值。检查
    • 使用调试器语句,在var selectOneValue= $('#select1').val(); 处没有附加到选择框的选项,因为用于获取#select1 数据的ajax 调用尚未返回。但它仍然继续发出 ajax 请求以填充#select2。但由于selectOneVal 为空,调用失败
    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 2012-02-22
    • 2011-09-11
    • 2014-03-28
    • 2012-11-25
    • 2015-04-16
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多