【问题标题】:Missing understanding on Javascript function缺少对 Javascript 函数的理解
【发布时间】:2018-09-16 00:20:19
【问题描述】:

我有一个通用的 MVC aspnetcore 设置,它从本地数据库中提取数据,该数据库中包含所有美国邮政编码、与之相关的州和城市。在输入 3 位数字表示他们应该推断的状态,然后在 5 位数字放入文本框中后填写缺失的城市后,我试图撤回建议。 令我困惑的问题是,在 javascript 函数数据中有返回的信息。但是一旦作用域离开函数并且尝试将另一个文本框的值设置为任何该信息失败,该信息就会丢失。

我的看法

@section Scripts{
     <script src="Scripts/jquery-1.5.min.js" type="text/javascript"></script>
     <script src="~/js/data.js" type="text/javascript"></script>
}
<div class="form-group">
    <label asp-for="Zip" class="col-xs-2 control-label"></label>
    <div class="col-xs-6">
        <input id="Zip" asp-for="Zip" class="form-control" onkeyup="loadData()"/>
        <span asp-validation-for="Zip" class="text-danger" />
    </div>
</div>

我的 javascript 文件

function loadData() {
     var str = $("#Zip").val();
     if (str.length == 3){
        $.get("/Localities/OnChange", { id: str }, function (data) {
            $("#Code").val(data.code);
        });
    }
    if (str.length == 5) {
        $.get("/Localities/OnChange", { id: str }, function (data) {
            $("#Boroughs").val(data.boroughs);
            $("#City").val(data.city);
            $("#Code").val(data.code);
            $("#Country").val(data.country);
            $("#County").val(data.county);
            var temp = data.city;
        });
    }
}

我的控制器

 [HttpGet]
    public Localities OnChange(string id)
    {
        Localities temp = _context.Localities.FirstOrDefault(x => x.Zip.StartsWith(id));
        var temp2 = JsonConvert.SerializeObject(temp);
        return temp;
    }

【问题讨论】:

  • ..因为 data 是传递给您的 $.get 回调函数的参数,因此它的范围在该函数内。如果您希望将其范围限定在其他地方,则必须将其推送到其他地方,例如全局变量或其他一些指定用于存储/引用这种性质的事物的命名空间变量。
  • 了解要点的超级基本示例:window.data = data; 这会将其推送到同名的全局(窗口)范围变量。不过,这通常是不好的做法。最好将其推送到某个数据处理层。
  • 我相信我尝试将它传递给 loadData 函数中的一个变量,但它不会这样做,就像它没有设置任何文本框值一样;因此,即使我没有尝试在视图中创建更全局的值,也不知道这将如何产生不同的结果。
  • 我知道适当的包装器很容易破坏代码。至于理解 ajax(不完全),但我的主要问题可能是为什么在它离开 .get 后发送了响应,而数据最终确实被返回了,我该如何像我试图做的那样最终填充信息。跨度>

标签: javascript asp.net-core


【解决方案1】:

这里几乎没有潜在的问题:

1) 在此代码中:

function loadData() {
     var str = $("#Zip").val();
     if (str.length == 3){
        $.get("/Localities/OnChange", { id: str }, function (data) {
            $("#Code").val(data.code);
        });
    }
    if (str.length == 5) {
        $.get("/Localities/OnChange", { id: str }, function (data) {
            $("#Boroughs").val(data.boroughs);
            $("#City").val(data.city);
            $("#Code").val(data.code);
            $("#Country").val(data.country);
            $("#County").val(data.county);
            var temp = data.city;
        });
    }
}

第二个 GET 中的 var temp 只能在现在的函数中使用。

第二个最有可能的原因是您的代码没有显示数据是因为它很可能

data.data.citydata.data.code 等等

如果你这样做了 console.log(data); 我很确定它嵌套在另一个数据包装器中。

告诉我 我会将函数变量更改为函数(响应),这样你就会被你所处的级别弄糊涂了。

这应该可以工作,或者至少让您更好地了解损坏的地方:

var temp; // Global

function loadData() {
         var str = $("#Zip").val();
         if (str.length == 3){
            $.get("/Localities/OnChange", { id: str }, function (response) {
                $("#Code").val(response.data.code);
            });
        }
        if (str.length == 5) {
            $.get("/Localities/OnChange", { id: str }, function (response) {
                $("#Boroughs").val(response.data.boroughs);
                $("#City").val(response.data.city);
                $("#Code").val(response.data.code);
                $("#Country").val(response.data.country);
                $("#County").val(response.data.county);
                temp = response.data.city;
            });
        }
    }

同时检查您的控制台是否有任何其他可能阻止代码执行的错误。

检查这个:

右键单击元素并获取 ID

<input type="text" id="#city">

此 ID 可能与渲染后的预期不同

【讨论】:

  • var temp; 可能应该在回调范围之外定义 - 然后在回调范围内使用temp = data.city 填充......甚至可能称为lastResponse。将响应数据传递给函数也有助于回调地狱。
  • @MartinZeitler 是的,你是 100% 正确的,我不确定他用它做什么,但我确信他无法使用它。所以是的,他必须在全球范围内声明它并以这种方式填充它。
  • 好吧,我将 temp 变量与断路器一起放在那里,这样我就可以真正看到正在返回的值。当我尝试在 .get 之外休息时,我确实看到其他包装器中似乎有数百个无汉堡(又名 nothgin,这对我来说意味着任何真实数据)
  • @Edward 我明白了,你试过我上面写的吗?我会更新我的答案,你可以复制过去的代码,看看它是如何工作的。
  • 我取出了临时行,并添加了额外的data.,但没有帮助。我感谢 Intellisense 在这些情况下似乎没有帮助
猜你喜欢
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多