【问题标题】:How I do initial JavaScript Ajax initialization?如何进行初始 JavaScript Ajax 初始化?
【发布时间】:2017-11-02 03:42:58
【问题描述】:

我正在使用 ajax 提取信息。我希望它首先启动我的 document.ready 函数(ajax),因为淘汰文件首先启动并且我的“var initialData”值变为空。我的 Ajax 是如何开始的?

Here is my F12 Source

我的脚本:

<script type="text/javascript">
        var initialData;
        function functionViewModel() {
                $(document).ready(function () {
                    $.ajax({
                        type: "POST",
                        url: "KnockoutGrid2.aspx/GonderUrunler",
                        data: "{}",
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function (msg) {
                            console.log(msg.d);
                            initialData = msg.d;
                        }
                    });
                });
            var fn = {
                friends: ko.observableArray(initialData)
            };
            fn.removeUser = function (item) {
                fn.friends.remove(item);
            };
            return fn;
        };
        ko.applyBindings(functionViewModel());
    </script>

【问题讨论】:

    标签: javascript jquery ajax knockout.js


    【解决方案1】:

    更新 2 @user3297291 的回答比我的好,因为是 Knockout 处理了这个表单的所有状态。请不要在 ajax 请求的答案中使用applybindings

    用户需要知道数据还没有加载,这可以通过敲除来处理。

    原答案

    也许如果你将 Knockout 的初始化移到 success 函数中:

        <script type="text/javascript">
            $(document).ready(function () {
                $.ajax({
                    type: "POST",
                    url: "KnockoutGrid2.aspx/GonderUrunler",
                    data: "{}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg) {
                        console.log(msg.d);
                        initialData = msg.d;
    
                        // All initialization inside the 'success' function
                        function functionViewModel(initialData) {
                            var fn = {
                                friends: ko.observableArray(initialData)
                            };
                            fn.removeUser = function (item) {
                                fn.friends.remove(item);
                            };
                            return fn;
                        };
    
                        ko.applyBindings(functionViewModel(initialData));
                    }
                });
            });
        </script>
    

    您可以显示带有以下消息的 div:“正在加载数据...”。

    success运行时,隐藏这个div。

    更新 1 在您发表评论后,我不知道您为什么需要return fn。我提出这个解决方案:

        <script type="text/javascript">
    
            // Updating 'functionViewModel()' to add 'self'.
            // Move functionViewModel()' outside ajax response
            function functionViewModel(initialData) {
                var self = this;
    
                self.friends = ko.observableArray(initialData);
    
                self.removeUser = function (item) {
                    self.friends.remove(item);
                };
            };
    
            $(document).ready(function () {
                $.ajax({
                    type: "POST",
                    url: "KnockoutGrid2.aspx/GonderUrunler",
                    data: "{}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg) {
                        console.log(msg.d);
                        initialData = msg.d;
    
                        // All initialization inside the 'success' function
    
                        ko.applyBindings(functionViewModel(initialData));
                    }
                });
            });
        </script>
    

    这里我使用self(请参阅Managing ‘this’)并且不返回fn,因为Knockout 会处理它的状态。

    【讨论】:

    • 所有数据都显示为真,但这次给出此错误。你可以在这里看到:imgim.com/844incib776110.png 而且我认为你忘记了 console.log() 下的 write var initialData。
    • 是的,这段代码是真的。但是现在我需要将数组转换为initialData,因为msg.d 传入字符串并且我需要转换它:) 更新:我找到了我的答案我喜欢这样并且代码工作“var initialData = JSON.parse(msg.d);”所有现在又好了 :))
    • 哦,有一件事,functionViewModel() 可以移到$(document).ready() 函数之外。
    • 尽管这有效,但它不应该这样做。仅在加载所有数据后应用绑定违背了可观察/数据绑定属性的主要目的之一。
    • @user3297291 谢谢,你说得对,Knockout 可以处理所有的状态,包括等待Ajax 请求显示数据。
    【解决方案2】:

    在您的代码中使用async:false

                       $.ajax({
                            type: "POST",
                            url: "KnockoutGrid2.aspx/GonderUrunler",
                            data: "{}",
                            async : false,
                            contentType: "application/json; charset=utf-8",
                            dataType: "json",
                            success: function (msg) {
                                console.log(msg.d);
                                initialData = msg.d;
                            }
                        });
    

    【讨论】:

    • 还是一样...但是给出这个警告:" jquery-3.1.1.js:9425 [弃用] 主线程上的同步 XMLHttpRequest 已被弃用,因为它对最终用户的体验产生不利影响。如需更多帮助,请查看xhr.spec.whatwg.or"
    • 所以初始数据还是空白?
    • 是的,还是空白。你可以在这里看到:imgim.com/1024incij4042449.png
    • 为什么不将 (var fn=) 部分放入成功函数中
    • 这次(var Fn)没有出现。我认为 knockoutJs 正在做某事,但我不知道答案......而 var Fn 将变为空白。我得到了2个错误。图片在这里:imgim.com/6873incib9929685.png
    【解决方案3】:

    不想希望在处理您的 ajax 响应之前等待 applyBindings...在。

    应该做什么:

    • $(document).ready 触发后立即应用绑定
    • 确保您的视图模型使用 observable 属性,以便您以后轻松注入数据
    • 确保您定义了某种加载状态,以向您的用户显示正在下载的数据

    即:

    function functionViewModel() {
      var friends = ko.observableArray([]);
      var loading = ko.observable(true);
      var removeUser = function(user) {
        friends.remove(user);
      }
      
      // Get the data and write it to an observable property once done
      $.ajax({
        type: "POST",
        url: "KnockoutGrid2.aspx/GonderUrunler",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
          friends(JSON.parse(msg.d));
          loading(false);
        }
      });
        
      return {
        friends: friends,
        loading: loading,
        removeUser: removeUser
      };
    };
    
    $(document).ready(function() {
      ko.applyBindings(functionViewModel());
    });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2015-04-24
      • 2014-12-29
      相关资源
      最近更新 更多