【发布时间】:2015-02-27 07:57:21
【问题描述】:
我对 AngularJS 非常陌生(来自 Java 和 JQuery 背景),并试图了解做所有事情的“Angular 方式”,尤其是指令。
我想要一些帮助来理解我应该在哪里放置一些辅助函数(不是特定于特定控制器),这些辅助函数可以由指令使用的模板代码调用。在这种情况下,我的函数只能由模板使用(因此是指令)。
具体示例:我将有很多表要分页。分页对每个表的工作方式类似。每个表都有自己的控制器来从服务器获取数据。所以,我假设指令是重用代码的好方法。
我创建了一个指令和一个模板,它使用特定数据来显示下一个和上一个分页链接。他们工作得很好。
问题:在下面的代码中,isFirstPage(page) 和 isLastPage(page) 的定义应该放在哪里?我不希望它们在每个需要分页的表的每个控制器上。我也不认为最好在全球范围内定义它们,因为它们只与分页相关。看来我应该能够直接在指令中定义它们。我尝试在链接函数中定义它们。那种工作,但是当视图被加载时,它们被调用的次数远远超过预期的 3 次(大约是 10-20 次)。另外,有时会在控制台中显示错误(无法读取未定义的属性“编号”)。而且,文档说链接功能主要是为了操作 DOM。由于所有这些原因,似乎链接函数可能是定义它们的错误位置。
指令:
.directive('pagination', function() {
return {
restrict: 'E',
templateUrl: 'shared/partials/pagination-links.html'
});
示例控制器(相关部分) - 所有都将与不同的默认排序和页面大小和服务相似。在这里,我定义了要在指令模板中使用的 $scope.page 和 $scope.paginationBaseUrl,因为它们包含数据特定的视图和表。这些效果很好。
var table1Controllers = angular.module('rmApp.table1Controllers', ['rmApp.Table1Services']);
table1Controllers.controller('Table1Controller', ['$scope', '$location', 'Table1Service'
function ($scope, $location, Table1Service) {
var search = $location.search();
var page = search.page||0;
var size = search.size||20;
var sort = search.sort||'id,asc';
var table1Page = Table1Service.get({page:page, size:size, sort:sort}, function() {
$scope.page = table1Page.page; //this is an object from server with several attributes
$scope.paginationBaseUrl = $location.path() + "?size=" + size + "&sort=" + sort;
});
}]);
查看 HTML:只需在表格后调用指令: ...
模板 HTML sn-p(理想)。 page 和 paginationBaseUrl 是(并且必须)在每个控制器上用它们的特定数据定义的。这是一个sn-p。我在页面对象上使用了更多属性。我的问题是在哪里定义 isFirstPage(page) 和 isLastPage(page):
<nav>
<li ng-class="{disabled: **isFirstPage(page)**}">
<a ng-show="!isFirstPage(page)" ng-href="#{{paginationBaseUrl}}&page={{page.number - 1}}">Prev</a>
<span ng-show="isFirstPage(page)">Prev</span>
</li>
<li ng-class="{disabled: **isLastPage(page)**}">
<a ng-show="!isLastPage(page)" ng-href="#{{paginationBaseUrl}}&page={{page.number + 1}}">Next</a>
<span ng-show="isLastPage(page)">Next</span>
</li>
</ul>
</nav>
我要调用的函数,例如: isFirstPage:函数(pageInfo){ 返回 pageInfo.number === 0; }
在这种情况下,这些功能非常基本,我可以硬编码它们,但我知道我会遇到类似的问题,所以我想知道正确的方法。也请让我知道是否有更好的方法来完成类似分页指令的操作。也许ngInclude?
【问题讨论】:
标签: angularjs function directive