AngularJS - 不在$ scope.Watch更改上呈现分页(包括CodePen)

时间:2016-04-19 23:16:19

标签: javascript angularjs angular-ui-bootstrap

问题背景:

我正在学习AngularJS。我创建了一个简单的应用程序,它接受3个表单输入,并且在提交此表单时,应该呈现分页列表。我对UI-Bootstrap很依赖。这是一个Plnkr,显示了我尝试合并到我的应用中的分页示例:http://plnkr.co/edit/81fPZxpnOQnIHQgp957q?p=preview

问题&演示:

到目前为止,这是我在CodePen上的代码链接:

http://codepen.io/daveharris/pen/NNMQyy

我有一个1000个项目的列表,这些项目填充在我的SearchingService模型上,并在两个控制器之间注入和共享。

ng-repeat模型上的searchingService.searchList列表发生更改时,我无法填充分页SearchingService, 就好像$scope.Watch没有被触发一样。

非常感谢任何有助于深入了解的内容。

2 个答案:

答案 0 :(得分:5)

将第31行从$watch更改为$watchCollection。由于您的服务正在改变数组(通过.push),因此引用保持不变,因此$watch不会触发。 $watchCollection将观看对数组成员的引用,而不是对数组本身的引用。

答案 1 :(得分:1)

正如bchemy指出的,function dataURItoBlob(dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString; if (dataURI.split(',')[0].indexOf('base64') >= 0) byteString = atob(dataURI.split(',')[1]); else byteString = unescape(dataURI.split(',')[1]); // separate out the mime component var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], {type:mimeString}); } 应更改为var dataURL = canvas.toDataURL('image/jpeg', 0.5); var blob = dataURItoBlob(dataURL); var fd = new FormData(document.forms[0]); fd.append("canvasImage", blob); 。但是这种变化不足以让你的应用程序正常使用你当前的代码,因为分页看起来很糟糕。

您还应该添加另一个观察程序来控制分页,作为您要复制的示例中的分页:

$watch

$watchCollection数组中的$scope.$watch('currentPage + numPerPage', function() { var begin = (($scope.currentPage - 1) * $scope.numPerPage) , end = begin + $scope.numPerPage; $scope.filteredItems = $scope.searchingService.searchList.slice(begin, end); }); 数组也会重复$scope.items,这会使分页长度变得混乱。

我创建了这个Plunker,您可以在其中看到您的示例完全正常工作。