如何创建受限指令

How to create a restricted directive?

本文关键字:指令 创建 何创建      更新时间:2023-09-26

我正在试验AngularJS和NG表,但无法解决以下问题:

我正在NG表中显示Django应用程序中的User对象集合。模型的属性之一是布尔值,指示对象是否处于活动状态。我想使用AngularJS指令显示Font Awesome集合中的字形,而不是显示true/false。

从各种样品中,我得到了以下内容。

模块:

var main = angular.module("main", ["ngTable"]);

检索要在表中显示的对象:

main.factory('User', function ($http) {
    return {
        async: function() {
            var promise = $http.get('api/v1/users').then(function (response) {
                return response.data["objects"];
            });
            // Return the promise to the controller
            return promise;
        }
    };
});

控制器和将布尔值转换为字形的指令:

main.controller("UsersCtrl", function ($scope, $filter, ngTableParams, User) {
    User.async().then(function(data) {
        $scope.tableParams = new ngTableParams({
            page: 1,
            count: 4,
            sorting: {
                name: 'asc'
            }
        },{
            total: data.length, // length of data
            getData: function ($defer, params) {
                // use build-in angular filter
                var orderedData = params.sorting() ? $filter('orderBy')(data, params.orderBy()) : data;
                $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
            }
        });
    });
}).directive('boolean', function () {
    return {
        restrict: 'E',
        link: function (scope, elem, attrs) {
            var userObject = scope.userObject;
            if (userObject["active"]) {
                console.log("active");
                console.log(elem);
                elem.html = "<i class='fa fa-check text-success fa-lg'></i>";
            } else {
                console.log("not active");
                console.log(elem);
                elem.html = "<i class='fa fa-times text-danger fa-lg'></i>";
            }
        }
    }
});

然后在我的HTML模板中:

    <table ng-table="tableParams" class="table">
        <tr ng-repeat="propertyObject in $data">
            <td data-title="'Name'" sortable="'name'">
                [[ userObject.name ]]
            </td>
            <td>
                <boolean>[[ userObject.active ]]</boolean>
            </td>
        </tr>
    </table>

由于与Django模板约定的冲突,我不得不将Angular默认的双花括号改为方括号。

该表显示ok,但对于我的boolean directive,它无法显示字形,仍然只显示true或false。通过登录控制台,我可以检查实际的对象,它们看起来是正确的。我显然错过了什么,但如果能提供任何帮助。。。

您遇到的问题是,在尝试操作元素html之前,需要让ng-repeat完成它的摘要。有几种方法可以做到这一点,使用attrs.$observe$timeout

通常情况下,在元素被呈现为之前,您的代码就已经启动了

对于你正在做的事情,你可以简单地使用ng-class,而不需要指令

<table ng-table="tableParams" class="table">
    <tr ng-repeat="propertyObject in $data">
        <td data-title="'Name'" sortable="'name'">
            [[ userObject.name ]]
        </td>
        <td>
            <i class='fa fa-times fa-lg' 
             ng-class="{'text-danger':!userObject.active,'text-success':userObject.active}">
            </i>
        </td>
    </tr>
</table>

或者,您可以真正简化指令,使用ng-class 仅将<i>返回为template