2015-04-14 48 views
0

我想实现从SharePoint使用应用程序模型的搜索列表项,我使用角js作为客户端框架。角js的SharePoint 2013数据绑定不起作用

我没有收到页面加载的任何问题,但同时无法看到HTML中的相应绑定数据。

这里是整个代码

<%-- The following 4 lines are ASP.NET directives needed when using SharePoint components --%> 
    <%@ Page Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
    MasterPageFile="~masterurl/default.master" Language="C#" %> 
     <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
     %> 
      <%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
      %> 
       <%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
       %> 
        <%-- The markup and script in the following Content element will be placed in the <head>of the page --%> 
         <asp:Content ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server"> 
          <script type='text/javascript' src='http://code.jquery.com/jquery-1.8.3.js'></script> 
          <script src="http://code.angularjs.org/1.1.0/angular.min.js"></script> 
          <meta charset="utf-8"> 
          <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/css/bootstrap.no-icons.min.css" rel="stylesheet"> 
          <link href="http://netdna.bootstrapcdn.com/font-awesome/2.0/css/font-awesome.css" rel="stylesheet"> 
          <link rel="stylesheet" type="text/css" href="/css/result-light.css"> 
          <style type='text/css'></style> 
          <script type="text/javascript"> 
           if(typeof jQuery == 'undefined') 
            { 
             alert ('typeof jQuery == undefined'); 
            } 
          </script> 
          <script type="text/javascript"> 
           var sortingOrder = 'name'; 
          </script> 
          <script type='text/javascript'> 
           //<![CDATA[ 

             function ctrlRead($scope, $filter) { 
              // init 
              $scope.sortingOrder = sortingOrder; 
              $scope.reverse = false; 
              $scope.filteredItems = []; 
              $scope.groupedItems = []; 
              $scope.itemsPerPage = 5; 
              $scope.pagedItems = []; 
              $scope.currentPage = 0; 
              $scope.items = [ 
               {"id":"1","name":"name 1","description":"description 1","field3":"field3 1","field4":"field4 1","field5 ":"field5 1"}, 
               {"id":"2","name":"name 2","description":"description 1","field3":"field3 2","field4":"field4 2","field5 ":"field5 2"}, 
               {"id":"3","name":"name 3","description":"description 1","field3":"field3 3","field4":"field4 3","field5 ":"field5 3"}, 
               {"id":"4","name":"name 4","description":"description 1","field3":"field3 4","field4":"field4 4","field5 ":"field5 4"}, 
               {"id":"5","name":"name 5","description":"description 1","field3":"field3 5","field4":"field4 5","field5 ":"field5 5"}, 
               {"id":"6","name":"name 6","description":"description 1","field3":"field3 6","field4":"field4 6","field5 ":"field5 6"}, 
               {"id":"7","name":"name 7","description":"description 1","field3":"field3 7","field4":"field4 7","field5 ":"field5 7"}, 
               {"id":"8","name":"name 8","description":"description 1","field3":"field3 8","field4":"field4 8","field5 ":"field5 8"}, 
               {"id":"9","name":"name 9","description":"description 1","field3":"field3 9","field4":"field4 9","field5 ":"field5 9"}, 
               {"id":"10","name":"name 10","description":"description 1","field3":"field3 10","field4":"field4 10","field5 ":"field5 10"}, 
               {"id":"11","name":"name 11","description":"description 1","field3":"field3 11","field4":"field4 11","field5 ":"field5 11"}, 
               {"id":"12","name":"name 12","description":"description 1","field3":"field3 12","field4":"field4 12","field5 ":"field5 12"}, 
               {"id":"13","name":"name 13","description":"description 1","field3":"field3 13","field4":"field4 13","field5 ":"field5 13"}, 
               {"id":"14","name":"name 14","description":"description 1","field3":"field3 14","field4":"field4 14","field5 ":"field5 14"}, 
               {"id":"15","name":"name 15","description":"description 1","field3":"field3 15","field4":"field4 15","field5 ":"field5 15"}, 
               {"id":"16","name":"name 16","description":"description 1","field3":"field3 16","field4":"field4 16","field5 ":"field5 16"}, 
               {"id":"17","name":"name 17","description":"description 1","field3":"field3 17","field4":"field4 17","field5 ":"field5 17"}, 
               {"id":"18","name":"name 18","description":"description 1","field3":"field3 18","field4":"field4 18","field5 ":"field5 18"}, 
               {"id":"19","name":"name 19","description":"description 1","field3":"field3 19","field4":"field4 19","field5 ":"field5 19"}, 
               {"id":"20","name":"name 20","description":"description 1","field3":"field3 20","field4":"field4 20","field5 ":"field5 20"} 
              ]; 

              var searchMatch = function (haystack, needle) { 
               if (!needle) { 
                return true; 
               } 
               return haystack.toLowerCase().indexOf(needle.toLowerCase()) !== -1; 
              }; 

              // init the filtered items 
              $scope.search = function() { 
               $scope.filteredItems = $filter('filter')($scope.items, function (item) { 
                for(var attr in item) { 
                 if (searchMatch(item[attr], $scope.query)) 
                  return true; 
                } 
                return false; 
               }); 
               // take care of the sorting order 
               if ($scope.sortingOrder !== '') { 
                $scope.filteredItems = $filter('orderBy')($scope.filteredItems, $scope.sortingOrder, $scope.reverse); 
               } 
               $scope.currentPage = 0; 
               // now group by pages 
               $scope.groupToPages(); 
              }; 

              // calculate page in place 
              $scope.groupToPages = function() { 
               $scope.pagedItems = []; 

               for (var i = 0; i < $scope.filteredItems.length; i++) { 
                if (i % $scope.itemsPerPage === 0) { 
                 $scope.pagedItems[Math.floor(i/$scope.itemsPerPage)] = [ $scope.filteredItems[i] ]; 
                } else { 
                 $scope.pagedItems[Math.floor(i/$scope.itemsPerPage)].push($scope.filteredItems[i]); 
                } 
               } 
              }; 

              $scope.range = function (start, end) { 
               var ret = []; 
               if (!end) { 
                end = start; 
                start = 0; 
               } 
               for (var i = start; i < end; i++) { 
                ret.push(i); 
               } 
               return ret; 
              }; 

              $scope.prevPage = function() { 
               if ($scope.currentPage > 0) { 
                $scope.currentPage--; 
               } 
              }; 

              $scope.nextPage = function() { 
               if ($scope.currentPage < $scope.pagedItems.length - 1) { 
                $scope.currentPage++; 
               } 
              }; 

              $scope.setPage = function() { 
               $scope.currentPage = this.n; 
              }; 

              // functions have been describe process the data for display 
              $scope.search(); 

              // change sorting order 
              $scope.sort_by = function(newSortingOrder) { 
               if ($scope.sortingOrder == newSortingOrder) 
                $scope.reverse = !$scope.reverse; 

               $scope.sortingOrder = newSortingOrder; 

               // icon setup 
               $('th i').each(function(){ 
                // icon reset 
                $(this).removeClass().addClass('icon-sort'); 
               }); 
               if ($scope.reverse) 
                $('th.'+new_sorting_order+' i').removeClass().addClass('icon-chevron-up'); 
               else 
                $('th.'+new_sorting_order+' i').removeClass().addClass('icon-chevron-down'); 
              }; 
              $scope.$apply(); 
             }; 
             ctrlRead.$inject = ['$scope', '$filter']; 

             //]]> 
          </script> 
         </asp:Content> 
         <%-- The markup and script in the following Content element will be placed in the <body>of the page --%> 
          <asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server"> 
           <div ng-controller="ctrlRead"> 
            <div class="input-append"> 
             <input type="text" ng-model="query" ng-change="search()" class="input-large search-query" placeholder="Search"> 
             <span class="add-on"> 
              <i class="icon-search"></i> 
             </span> 
            </div> 
            <table class="table table-striped table-condensed table-hover"> 
             <thead> 
              <tr> 
               <th class="id">Id&nbsp; 
                <a ng-click="sort_by('id')"><i class="icon-sort"></i></a> 
               </th> 
               <th class="name">Name&nbsp; 
                <a ng-click="sort_by('name')"><i class="icon-sort"></i></a> 
               </th> 
               <th class="description">Description&nbsp; 
                <a ng-click="sort_by('description')"><i class="icon-sort"></i></a> 
               </th> 
               <th class="field3">Field 3&nbsp; 
                <a ng-click="sort_by('field3')"><i class="icon-sort"></i></a> 
               </th> 
               <th class="field4">Field 4&nbsp; 
                <a ng-click="sort_by('field4')"><i class="icon-sort"></i></a> 
               </th> 
               <th class="field5">Field 5&nbsp; 
                <a ng-click="sort_by('field5')"><i class="icon-sort"></i></a> 
               </th> 
              </tr> 
             </thead> 
             <tfoot> 
              <td colspan="6"> 
               <div class="pagination pull-right"> 
                <ul> 
                 <li ng-class="{disabled: currentPage == 0}"> 
                  <a href ng-click="prevPage()">« Prev</a> 
                 </li> 
                 <li ng-repeat="n in range(pagedItems.length)" ng-class="{active: n == currentPage}" ng-click="setPage()"> 
                  <a href ng-bind="n + 1">1</a> 
                 </li> 
                 <li ng-class="{disabled: currentPage == pagedItems.length - 1}"> 
                  <a href ng-click="nextPage()">Next »</a> 
                 </li> 
                </ul> 
               </div> 
              </td> 
             </tfoot> 
             <tbody> 
              <tr ng-repeat="item in pagedItems[currentPage] | orderBy:sortingOrder:reverse"> 
               <td>{{item.id}}</td> 
               <td>{{item.name}}</td> 
               <td>{{item.description}}</td> 
               <td>{{item.field3}}</td> 
               <td>{{item.field4}}</td> 
               <td>{{item.field5}}</td> 
              </tr> 
             </tbody> 
            </table> 
           </div> 
          </asp:Content> 

回答

0

我钻下来,并随后结合的模块和控制器的基本方法。

改变的代码是下面

<%-- The following 4 lines are ASP.NET directives needed when using SharePoint components --%> 
    <%@ Page Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
    MasterPageFile="~masterurl/default.master" Language="C#" %> 
     <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
     %> 
      <%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
      %> 
       <%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" 
       %> 
        <%-- The markup and script in the following Content element will be placed in the <head>of the page --%> 
         <asp:Content ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server"> 
          <script type='text/javascript' src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 
          <script type='text/javascript' src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> 
          <link rel="stylesheet" type="text/css" href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"> 
          <style type='text/css'></style> 
          <script type="text/javascript"> 
           if(typeof jQuery == 'undefined') 
            { 
             //document.write(unescape("&lt;script type=&#39;text/javascript&#39; src=&quot;https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js&quot;&gt;&lt;/script&gt;")); 
            } 
          </script> 
          <script type="text/javascript"> 
           var sortingOrder = 'name'; 
          </script> 
          <script type='text/javascript'> 
           //<![CDATA[ 

           var app = angular.module("SearchApp", []); 

           app.controller("SearchCtrl", function($scope,$filter) { 

              $scope.sortingOrder = sortingOrder; 
              $scope.reverse = false; 
              $scope.filteredItems = []; 
              $scope.groupedItems = []; 
              $scope.itemsPerPage = 5; 
              $scope.pagedItems = []; 
              $scope.currentPage = 0; 
              $scope.items = []; 

            $scope.showAll = function() { 
              $scope.items = [ 
               {"id":"1","name":"name 1","description":"description 1","field3":"field3 1","field4":"field4 1","field5 ":"field5 1"}, 
               {"id":"2","name":"name 2","description":"description 1","field3":"field3 2","field4":"field4 2","field5 ":"field5 2"}, 
               {"id":"3","name":"name 3","description":"description 1","field3":"field3 3","field4":"field4 3","field5 ":"field5 3"}, 
               {"id":"4","name":"name 4","description":"description 1","field3":"field3 4","field4":"field4 4","field5 ":"field5 4"}, 
               {"id":"5","name":"name 5","description":"description 1","field3":"field3 5","field4":"field4 5","field5 ":"field5 5"}, 
               {"id":"6","name":"name 6","description":"description 1","field3":"field3 6","field4":"field4 6","field5 ":"field5 6"}, 
               {"id":"7","name":"name 7","description":"description 1","field3":"field3 7","field4":"field4 7","field5 ":"field5 7"}, 
               {"id":"8","name":"name 8","description":"description 1","field3":"field3 8","field4":"field4 8","field5 ":"field5 8"}, 
               {"id":"9","name":"name 9","description":"description 1","field3":"field3 9","field4":"field4 9","field5 ":"field5 9"}, 
               {"id":"10","name":"name 10","description":"description 1","field3":"field3 10","field4":"field4 10","field5 ":"field5 10"}, 
               {"id":"11","name":"name 11","description":"description 1","field3":"field3 11","field4":"field4 11","field5 ":"field5 11"}, 
               {"id":"12","name":"name 12","description":"description 1","field3":"field3 12","field4":"field4 12","field5 ":"field5 12"}, 
               {"id":"13","name":"name 13","description":"description 1","field3":"field3 13","field4":"field4 13","field5 ":"field5 13"}, 
               {"id":"14","name":"name 14","description":"description 1","field3":"field3 14","field4":"field4 14","field5 ":"field5 14"}, 
               {"id":"15","name":"name 15","description":"description 1","field3":"field3 15","field4":"field4 15","field5 ":"field5 15"}, 
               {"id":"16","name":"name 16","description":"description 1","field3":"field3 16","field4":"field4 16","field5 ":"field5 16"}, 
               {"id":"17","name":"name 17","description":"description 1","field3":"field3 17","field4":"field4 17","field5 ":"field5 17"}, 
               {"id":"18","name":"name 18","description":"description 1","field3":"field3 18","field4":"field4 18","field5 ":"field5 18"}, 
               {"id":"19","name":"name 19","description":"description 1","field3":"field3 19","field4":"field4 19","field5 ":"field5 19"}, 
               {"id":"20","name":"name 20","description":"description 1","field3":"field3 20","field4":"field4 20","field5 ":"field5 20"} 
              ]; 
              $scope.filteredItems = $scope.items; 
              $scope.groupToPages(); 
              $event.preventDefault(); 

              }; 

              var searchMatch = function (haystack, needle) { 
               if (!needle) { 
                return true; 
               } 
               return haystack.toLowerCase().indexOf(needle.toLowerCase()) !== -1; 
              }; 

            // init the filtered items 
              $scope.search = function() { 
               $scope.filteredItems = $filter('filter')($scope.items, function (item) { 
                for(var attr in item) { 
                 if (searchMatch(item[attr], $scope.query)) 
                  return true; 
                } 
                return false; 
               }); 
               // take care of the sorting order 
               if ($scope.sortingOrder !== '') { 
                $scope.filteredItems = $filter('orderBy')($scope.filteredItems, $scope.sortingOrder, $scope.reverse); 
               } 
               $scope.currentPage = 0; 
               // now group by pages 
               $scope.groupToPages();           
              }; 

              $scope.groupToPages = function() { 
               $scope.pagedItems = []; 

               for (var i = 0; i < $scope.filteredItems.length; i++) { 
                if (i % $scope.itemsPerPage === 0) { 
                 $scope.pagedItems[Math.floor(i/$scope.itemsPerPage)] = [ $scope.filteredItems[i] ]; 
                } else { 
                 $scope.pagedItems[Math.floor(i/$scope.itemsPerPage)].push($scope.filteredItems[i]); 
                } 
               } 
              }; 

              $scope.range = function (start, end) { 
               var ret = []; 
               if (!end) { 
                end = start; 
                start = 0; 
               } 
               for (var i = start; i < end; i++) { 
                ret.push(i); 
               } 
               return ret; 
              }; 

               $scope.prevPage = function() { 
               if ($scope.currentPage > 0) { 
                $scope.currentPage--; 
               } 
              }; 

              $scope.nextPage = function() { 
               if ($scope.currentPage < $scope.pagedItems.length - 1) { 
                $scope.currentPage++; 
               } 
              }; 

              $scope.setPage = function() { 
               $scope.currentPage = this.n; 
              }; 

              // change sorting order 
              $scope.sort_by = function(newSortingOrder) { 

               if ($scope.sortingOrder == newSortingOrder) 
                $scope.reverse = !$scope.reverse; 

               $scope.sortingOrder = newSortingOrder; 

               // icon setup 
               $('th i').each(function(){ 
                // icon reset 
                $(this).removeClass().addClass('icon-sort'); 
               }); 
               if ($scope.reverse) 
                $('th.'+newSortingOrder+' i').removeClass().addClass('icon-chevron-up'); 
               else 
                $('th.'+newSortingOrder+' i').removeClass().addClass('icon-chevron-down'); 
              }; 

           }); 
           //]]> 
          </script> 
         </asp:Content> 
         <%-- The markup and script in the following Content element will be placed in the <body>of the page --%> 
          <asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server"> 
           <body> 
            <body ng-app="SearchApp"> 
             <div ng-controller="SearchCtrl"> 
              <div style="float:left">             
               <div class="input-append"> 
                <input type="text" ng-model="query" ng-change="search()" class="input-large search-query" placeholder="Search"> 
                <span class="add-on"> 
                 <i class="icon-search"></i> 
                </span> 
               </div> 
               <div> 
                <button type="button" ng-click="showAll()">Show all</button> 
               </div> 
              </div> 
              <div style="float:left;width:80%"> 
               <table class="table table-striped table-condensed table-hover"> 
                <thead> 
                 <tr> 
                  <th class="id"> 
                   <a ng-click="sort_by('id')">Id&nbsp;<i class="icon-sort"></i></a> 
                  </th> 
                  <th class="name"> 
                   <a ng-click="sort_by('name')">Name&nbsp;<i class="icon-sort"></i></a> 
                  </th> 
                  <th class="description"> 
                   <a ng-click="sort_by('description')">Description&nbsp;<i class="icon-sort"></i></a> 
                  </th> 
                  <th class="field3"> 
                   <a ng-click="sort_by('field3')">Field 3&nbsp;<i class="icon-sort"></i></a> 
                  </th> 
                  <th class="field4"> 
                   <a ng-click="sort_by('field4')">Field 4&nbsp;<i class="icon-sort"></i></a> 
                  </th> 
                  <th class="field5"> 
                   <a ng-click="sort_by('field5')">Field 5&nbsp;<i class="icon-sort"></i></a> 
                  </th> 
                 </tr> 
                </thead> 
                <tfoot> 
                 <td colspan="6"> 
                  <div class="pagination pull-right"> 
                   <ul> 
                    <li ng-class="{disabled: currentPage == 0}"> 
                     <a href ng-click="prevPage()">« Prev</a> 
                    </li> 
                    <li ng-repeat="n in range(pagedItems.length)" ng-class="{active: n == currentPage}" ng-click="setPage()"> 
                     <a href ng-bind="n + 1">1</a> 
                    </li> 
                    <li ng-class="{disabled: currentPage == pagedItems.length - 1}"> 
                     <a href ng-click="nextPage()">Next »</a> 
                    </li> 
                   </ul> 
                  </div> 
                 </td> 
                </tfoot> 
                <tbody> 
                 <tr ng-repeat="item in pagedItems[currentPage] | orderBy: 'id'"> 
                  <td>{{item.id}}</td> 
                  <td>{{item.name}}</td> 
                  <td>{{item.description}}</td> 
                  <td>{{item.field3}}</td> 
                  <td>{{item.field4}}</td> 
                  <td>{{item.field5}}</td> 
                 </tr> 
                </tbody> 
               </table> 
              </div> 
             </div> 
            </body> 
           </body> 
          </asp:Content>