【问题标题】:Give kendo datasource an angular scope variable给剑道数据源一个角度范围变量
【发布时间】:2013-10-17 20:44:23
【问题描述】:

我目前正在尝试用远程数据填充剑道网格。 剑道有自己的功能来获取数据,但我想使用我创建的角度工厂。

所以我有一个工厂,它有一个函数“getSkills”。该函数从我的api中获取所有技能对象。

angular.module('MyApp').factory('Factory', function ($resource) {
    return $resource('/api/v1/skills/', {  },
        {
            getSkills: { method: 'GET', isArray: true }
        });
});    

在我的 SkillController 中,我将这些获取的技能放在一个范围变量中。

$scope.skills = SkillFactory.getSkills();

我在这里初始化剑道网格:

$scope.gridOptions = {
                dataSource: {
                    data: $scope.skills,
                    schema: {
                        model: {
                            fields: {
                                ID: { type: "number" },
                                Name: { type: "string" },
                                CreatedBy: { type: "number" },
                                CreatedDate: { type: "string" },
                                EditedBy: { type: "number" },
                                EditedDate: { type: "string" },
                                InUse: { type: "boolean" }
                            }
                        }
                    },
                    pageSize: 20
                },
                scrollable: true,
                sortable: true,
                filterable: true,
                pageable: {
                    input: true,
                    numeric: false
                },
                selectable: true,
                columns: [
                    { field: "Name", title: "skillname", width: "130px" }
                ]
            };

大多数时候,ajax 回调比初始化剑道网格要慢。然后它会显示一个空表,因为表的数据没有绑定到角度 $scope.skills 变量。

我到处搜索,但我无法弄清楚如何在初始化中为数据属性使用自定义函数,或者如何将范围变量绑定到表。

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript angularjs kendo-ui kendo-grid angularjs-resource


    【解决方案1】:

    你看过 Angular 中的$q promises 吗?见$q promises in Angular

    【讨论】:

    • 这与问题无关。
    • @pehaada,使用承诺将确保在调用网格渲染例程之前获取数据。
    • 虽然您的陈述是正确的,但这并不是他正在寻找的答案。您的回答就像我说基于 REST 的 Web 服务将帮助您返回数据。
    【解决方案2】:

    这样的事情会让你走上正确的道路。您可以在传输读取方法中简单地调用您的工厂。你不能混合和匹配它们,你所有的读取、创建和销毁方法都必须使用工厂,或者它们都必须显式调用端点,即 url: '/api/myservice/' 而不是使用 $http就像在您的应用中的任何其他地方一样使用您的工厂:

    $scope.Source = new kendo.data.DataSource({
    
        transport: {
    
            read: function (options) {
    
                return $http.post('/api/getReportData/', {sDate: '', eDate: ''})
                    .success(function (data) {
    
                        options.success(data);
                        Toaster.Info("Refreshed");
    
                    })
                    .error(function () {
                        return;
                    });
    
                console.log("mmm");
            }
    
        }
    
    });
    

    【讨论】:

    • 是的,这看起来与我最终的做法非常相似!谢谢!
    【解决方案3】:

    我找到了一个更简单的解决方案: 在我的例子中,$scope.regs 定义了使用 Angular 从服务器 REST 服务更新的数据 $resource 通过“AppService”公开。该服务定义为:

        var registrationServices = angular.module('registrationServices', ['ngResource']);
    
        registrationServices.factory('AppService', ['$resource',
            function($resource) {
                return $resource('rest/registrations');
        }]);
    
    1. 我将 k-auto-bind = "false" 设置为 HTML 中的网格定义:

      <div id="form-item">
       <label for="appId" class="info">AppId:</label>
       <input id="appId" ng-model="searchAppId"> 
       <button id="search" class="k-button" ng-click="doSearch()" >Search</button>
      </div>  
      
      <div kendo-grid  k-data-source="registrations" k-selectable="'row'"
        k-pageable='{ "refresh": true, "pageSizes": true }'
        k-columns="registrationsColumns"
        k-sortable="true" k-groupable="true" k-filterable="true"
        k-on-change="selectedItem = data"
        k-auto-bind="false" >
      </div>
      
    2. 我没有使用“数据”属性绑定剑道网格数据源,而是使用“传输”和“读取”定义为函数,类似这样:

        $scope.regs;
      
       $scope.registrations = new kendo.data.DataSource({
          transport: {
              read: function(options) {
                  options.success($scope.regs);
              }
          },
          schema: {
              model: {
                  fields: {
                      registrationId: {type: "number"},
                      clientFullName: {type: "string"},
                      registrationDate2: {type: "number"},
                      registrationDate: {type: "date"}
                  }
              }
          },
          pageSize: 5,
          serverPaging: true,
          serverFiltering: true,
          serverSorting: true
      });
      
      
      $scope.registrationsColumns = [{"field": "registrationId", "title": "Id"},
          {"field": "clientFullName", "title": "Name"},
          {"field": "registrationDate",
              "title": "Registration Date",
              format: "{0:dd/MM/yyyy}",
              filterable: {ui: dateFilter, extra: "false"}
          }
      ];
          ....
      
    3. 然后,当我想刷新网格中的数据时,我使用 Angular $resource 使用回调。 :

      $scope.doSearch = function() {
          $scope.regs = AppService.query({"regId": $scope.searchAppId}, function(result) {
              $scope.registrations.read();
          });
      };
      

    它有效。 此解决方案的另一个优点是,您不必将网格创建转移到 Java Script 代码中,它可以保留在 HTML 中。

    【讨论】:

    • 我知道这篇文章很旧,但我注意到您将 serverPaging 设置为 True。您如何将 Kendo 的网格分页数据与您的请求一起传递,或者它是否在请求正文中传递?我正在尝试自己执行此操作,但继续分页工作
    【解决方案4】:

    我通过以下方式解决了这个问题:

    我给我的资源函数一个这样的回调:

    SkillFactory.getSkills({},
        function success(data) {
            createGrid(data);
        });
    

    在函数createGrid(data);我这样初始化数据:

     function createGrid(gridData) {
    $("#skillGrid").kendoGrid({
       dataSource: {
       data: gridData,
       schema: {
          model: {
            fields: {
                  ID: { type: "number" },
                  Name: { type: "string" },
                  CreatedBy: { type: "number" },
                  CreatedDate: { type: "string" },
                  EditedBy: { type: "number" },
                  EditedDate: { type: "string" },
                  InUse: { type: "boolean" }
                    }
                 }
              },
           pageSize: 20
           },
    

    所以在初始化的data属性中我设置了成功获取数据的时候。 我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多