【问题标题】:Getting data after binding data in Knockout在 Knockout 中绑定数据后获取数据
【发布时间】:2012-08-30 14:51:38
【问题描述】:

我有一个网格页面,并尝试使用 Knockout 绑定数据,但我想这是一个逻辑问题(因为我)。数据绑定在从 json 获取数据之前开始。

这里是javascript;

$(function () {



my.PriceListViewModel = (function () {
    var 
        data = ko.observableArray([]),
        totalCount = ko.observable(),
        currentPage = ko.observable(1),
        page = ko.observable(my.PageModel),
        goTo = function (d) {
            $.getJSON("/prices/GetByFilterViaJSON?limit=3&page=" + d, function (data) {
                Data(data.Data);
                CurrentPage(d);
            });
        },
        loadData = function () {
            $.getJSON("/prices/GetByFilterViaJSON?limit=3", function (list) {
                $.each(list, function (key, val) {
                    data.push(val);
                });

                my.PageModel.LoadData(data);
                Page = my.PageModel;
            });
        };
    return {
        Data: data,
        TotalCount: totalCount,
        CurrentPage: currentPage,
        Page: page,
        GoTo: goTo,
        LoadData: loadData
    };
})();

my.PageModel = (function () {
    loadData = function (data) {
        ko.mapping.fromJS(data.Page, {}, this);
    };

    return {
        LoadData: loadData
    };

})();

my.PriceListViewModel.LoadData();
debugger;
ko.applyBindings(my.PriceListViewModel);
});

和html;

<div class="section table_section">
<div class="section_inner" id="divTestKoRemoteGrid" >
    <div class="title_wrapper">
        <h2 data-bind="text: TotalCount">
            Prices</h2>
    </div>
    <div class="section_content">
        <div id="product_list">
            <!--[if !IE]>start table_wrapper<![endif]-->
            <div class="table_wrapper">
                <div class="table_wrapper_inner">
                    <table cellpadding="0" cellspacing="0" width="100%">
                        <tbody>
                            <tr>
                                <th>
                                    No.
                                </th>
                                <th>
                                    Tier
                                </th>
                                <th>
                                </th>
                            </tr>
                            <!-- ko foreach: Data -->
                            <tr data-bind="css: { second: $index() % 2 }">
                                <td data-bind="text: Id" style="width: 26px;">
                                </td>
                                <td data-bind="text: Tier" style="width: 35px;">
                                </td>
                                <td style="width: 120px;">
                                    <div class="actions_menu">
                                        <ul>
                                            <li><a class="edit" href="">edit</a></li>
                                            <li><a class="delete" href="">deny</a></li>
                                        </ul>
                                    </div>
                                </td>
                            </tr>
                            <!-- /ko -->
                        </tbody>
                    </table>
                </div>
            </div>
            <!--[if !IE]>end table_wrapper<![endif]-->
        </div>
        <!--[if !IE]>start pagination<![endif]-->
        <div class="pagination">
            <span class="page_no" data-bind="text: CurrentPage()"></span>
            <ul class="pag_list" data-bind="foreach: ko.utils.range(1, Page.TotalPage)">                   
                <li><a href=""  data-bind="click: $root.GoTo, css:{current_page: $data==$root.CurrentPage()}"><span><span data-bind="text: $data"></span></span></a>
                </li>
            </ul>
        </div>
        <!--[if !IE]>end pagination<![endif]-->
    </div>
</div>

如何在绑定开始前获取数据?

【问题讨论】:

    标签: javascript jquery mvvm knockout.js


    【解决方案1】:

    您可以调用 ko.applyBindings(my.PriceListViewModel);仅在检索到初始数据后。

    【讨论】:

      【解决方案2】:

      在文档就绪函数中调用应用绑定。

      【讨论】:

      • 数据不保证当时可用。
      【解决方案3】:

      我找到了解决方案。

      我使用了异步的 $.getJson 方法,因此数据是在加载视图模型之后来的。

      我用 $.ajax.async = false 更改了 $.getJson 方法,然后一切正常。

      my.PriceListViewModel = (function () {
          var 
              data = ko.observableArray([]),
              totalCount = ko.observable(),
              page = ko.observable(),
              goTo = function (d) {
                  $.getJSON("/prices/GetByFilterViaJSON?limit=6&page=" + d, function (list) {
                      data(list.Data);
                      page(list.Page);
                  });
              },
              loadData = function () {
                  $.ajax({
                      type: 'GET',
                      url: '/prices/GetByFilterViaJSON',
                      dataType: 'json',
                      success: function (list) {
                          data(list.Data);
                          page(list.Page);
                          totalCount(list.TotalCount);
                      },
                      data: { limit: 6 },
                      async: false
                  });
              };
          return {
              Data: data,
              TotalCount: totalCount,
              Page: page,
              GoTo: goTo,
              LoadData: loadData
          };
      })(); 
      my.PriceListViewModel.LoadData();
      ko.applyBindings(my.PriceListViewModel);
      

      【讨论】:

        猜你喜欢
        • 2016-01-18
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 2012-07-07
        • 2015-06-08
        • 2018-07-18
        • 1970-01-01
        • 2018-09-05
        相关资源
        最近更新 更多