Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了angularjs – 使用WebAPI进行ng网格的服务器端页面筛选排序大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个使用Ng-grid与ASP.NET WebAPI的简单工作示例。因此,我从ng网格示例页面( http://angular-ui.github.io/ng-grid/)中的服务器端分页示例开始;无论如何,我的网格总是显示空列,即使在调试时,我可以确认数据被正确接收。可能我只是在网格设置中遗漏了一些东西,但是我发现的所有样本看起来和我的相似。有人可以帮忙吗?这里是我做的:

更新#1:建议的解决方案似乎有效,但仅适用于第1页。每当我移动到新页面或进行任何其他需要刷新的操作时,即使服务器返回的数据按预期更改,显示的数据也保持不变。另外,从所有的代码示例中,我发现设置数据的正确方法似乎只是替换数组成员的值,而不是清空并重新填充它。我试过与https://groups.google.com/forum/#!searchin/angular/nggrid/angular/vUIfHWt4s_4/oU_C9w8j-uMJ提出的申请,但我得到相同的结果。

服务器端

只需创建一个新的MVC4应用程序,更新NuGet软件包,并添加角度和ng网格软件包。
我的假数据模型由Item类表示:

public sealed class Item
{
    public int id { get; set; }
    public String Name { get; set; }
    public int age { get; set; }
    public bool IsFemale { get; set; }
}

我还添加了几个模型来处理分页,过滤和排序各种数据集(我发现更容易一个常见的寻呼基础模型-PagedFilter-和一些派生模型):

public class PagedFilter
{
    privatE int _nPageSize;
    privatE int _nPagenumber;

    public int PageSize
    {
        get { return _nPageSize; }
        set
        {
            if (value < 1) throw new ArgumentOutOfRangeException("value");
            _nPageSize = value;
        }
    }

    public int Pagenumber
    {
        get { return _nPagenumber; }
        set
        {
            if (value < 1) throw new ArgumentOutOfRangeException("value");
            _nPagenumber = value;
        }
    }

    public int @R_305_10586@lItems { get; set; }

    public int @R_305_10586@lPages
    {
        get { return (int)R_2_11845@ath.Ceiling((doublE)(@R_305_10586@lItems / PageSizE)); }
    }

    public PagedFilter()
    {
        _nPageSize = 20;
        _nPagenumber = 1;
    }
}

这是ItemFilter:

public class ItemFilter : PagedFilter
{
    public List<String> SortFields { get; set; }
    public List<String> SortDirections { get; set; }
    public String Name { get; set; }
    public int? MinAge { get; set; }
    public int? MaxAge { get; set; }
}

然后我添加一个API控制器来获取项目:

public class ItemController : ApiController
{
    // fake data
    private readonly List<Item> _items;

    public ItemController()
    {
        Random rnd = new Random();
        _items = new List<Item>();
        char c = 'a';

        for (int i = 0; i < 1000; i++)
        {
            _items.Add(new Item
                            {
                                Id = i,Age = rnd.Next(1,100),IsFemale = ((i & 1) == 0),Name = String.Format(CultureInfo.InvariantCulture,"{0:00000}-{1}",i,new String(c,5))
                            });
            if (++c > 'z') c = 'a';
        }
    }

    public dynamic Get([FromUri] ItemFilter filter)
    {
        var items = _items.AsQueryable();

        // filtering
        if (!String.IsNullOrEmpty(filter.Name))
            items = items.Where(i => i.Name.Contains(filter.Name));

        if (filter.MinAge.Hasvalue)
            items = items.Where(i => i.Age >= filter.MinAge.value);

        if (filter.MaxAge.Hasvalue)
            items = items.Where(i => i.Age <= filter.MaxAge.value);

        // ...sorTing (using Dynamic Linq) omitted for brevity...

        // paging
        int n@R_305_10586@lItems = items.Count();
        items = items.Skip((filter.Pagenumber - 1) * filter.PageSizE)
                     .Take(filter.PageSizE);
        return new
                   {
                       @R_305_10586@lItems = n@R_305_10586@lItems,items = items.ToArray()
                   };
    }
}

客户端

在客户端,我的角度应用程序只是在Ng网格样本上建立的单个控制器:因此,我直接添加属性到$ scope,即使在一个现实世界的情况下,我宁愿使用一个模型(可能从一个TypeScript类)。 HTML:

<div ng-app="MyApp" ng-controller="MainController">
    <div ng-grid="gridoptions" style="height: 400px">
    </div>
</div>

JS:

var app = angular.module('MyApp',['ngGrid']);

app.controller('MainController',['$scope','$http',function ($scope,$http,$apply) {
    $scope.items = [];

    // filter
    $scope.filterOptions = {
        filterText: "",useExternalFilter: true
    };

    // paging
    $scope.@R_305_10586@lServerItems = 0;
    $scope.pagingOptions = {
        pageSizes: [25,50,100],pageSize: 25,currentPage: 1
    };

    // sort
    $scope.sortOptions = {
        fields: ["name"],directions: ["ASC"]
    };

    // grid
    $scope.gridoptions = {
        data: "items",columnDefs: [
            { field: "name",displayName: "Name",pinnable: true },{ field: "age",displayName: "Age",width: "60" },{ field: "isFemale",displayName: "F",width: "40" }
        ],enablePaging: true,enablePinning: true,pagingOptions: $scope.pagingOptions,filterOptions: $scope.filterOptions,keepLastSELEcted: true,multiSELEct: false,showcolumnMenu: true,showFilter: true,showGroupPanel: true,showFooter: true,sorTinfo: $scope.sortOptions,@R_305_10586@lServerItems: "@R_305_10586@lServerItems",useExternalSorTing: true,i18n: "en"
    };

    $scope.refresh = function() {
        setTimeout(function () {
            var p = {
                name: $scope.filterOptions.filterText,pagenumber: $scope.pagingOptions.currentPage,pageSize: $scope.pagingOptions.pageSize,sortFields: $scope.sortOptions.fields,sortDirections: $scope.sortOptions.directions
            };

            $http({
                url: "/api/item",method: "GET",params: p
            }).success(function(data,status,headers,config) {
                $scope.@R_305_10586@lServerItems = data.@R_305_10586@lItems;
                // SUGGESTION #1 -- empty and fill the array
                /* $scope.items.length = 0;
                angular.forEach(data.items,function (item) {
                   $scope.items.push(item);
                }); 
                */
                // https://groups.google.com/forum/#!searchin/angular/nggrid/angular/vUIfHWt4s_4/oU_C9w8j-uMJ
                $scope.$apply(function () { $scope.items = data.items; });
                if (!$scope.$$phasE) {
                    $scope.$apply();
                }
            }).error(function(data,config) {
                alert(JSON.Stringify(data));
            });
        },100);
    };

    // watches
    $scope.$watch('pagingOptions',function (newVal,oldVal) {
        if (newVal !== oldVal && newVal.currentPage !== oldVal.currentPagE) {
            $scope.refresh();
        }
    },truE);

    $scope.$watch('filterOptions',oldVal) {
        if (newVal !== oldVal) {
            $scope.refresh();
        }
    },truE);

    $scope.$watch('sortOptions',truE);

    $scope.refresh();
}]);

在我的代码中,成功回调被调用,我可以浏览data.items中的所有返回的项。然而,网格中没有显示任何内容。控制台中没有出现错误

经过一番尝试,我觉得我找到了正确的代码。关于$ apply的这篇文章帮助了我一点: http://jimhoskins.com/2012/12/17/angularjs-and-apply.html.事实上,如果我理解的很好,所以申请的呼吁根本不需要,因为我的数据来自已经提供的$ http。所以,我结束只是在成功回调中设置范围项变量。这是完整的JS再次,希望这可以帮助一些像我这样的新手。现在我将使用TypeScript模型,服务和所有真实世界的东西来扩展测试:我怕我必须做一些新的帖子…
本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。

大佬总结

以上是大佬教程为你收集整理的angularjs – 使用WebAPI进行ng网格的服务器端页面筛选排序全部内容,希望文章能够帮你解决angularjs – 使用WebAPI进行ng网格的服务器端页面筛选排序所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。