【问题标题】:AngularJS call common functions in a directive templateAngularJS 在指令模板中调用常用函数
【发布时间】: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


    【解决方案1】:

    方法被调用两到三次的行为是可以的。从角度文档:

    {{ }} 是一种指定数据绑定位置的声明方式 在 HTML 中。 AngularJS 会在任何时候自动更新这个文本 {{ }} 中的函数返回值发生变化。

    因此,您可以将这些函数保留在指令的链接函数中,只处理空值。

    Angular UI 团队已经为这个构建提供了一些东西。看看吧:http://angular-ui.github.io/bootstrap/#/pagination

    【讨论】:

    • 感谢有关电话的信息 3 次。我将它们从指令中的链接函数移动到控制器函数,因为它感觉好一点。 bootstrap angularjs 指令很棒!我不敢相信我没有找到他们。非常感谢。我一定会用一些。
    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多