【问题标题】:Custom filter angular on ng-repeat for stike text if disabled如果禁用,则在 ng-repeat 上为标记文本自定义过滤器角度
【发布时间】:2016-10-04 22:21:28
【问题描述】:

我想在我的 angularJS 应用程序上添加一个自定义过滤器。如果 ng-repat 中的对象将 isDeleted 标志设置为 true,我想要像 this way 这样的删除文本。
代码:这里是 HTML:

<table id="tableText" class="table table-hover table-striped" ng-init="allNews()">
                <tr>
                    <th>Titolo</th>
                    <th>Text</th>
                    <th>Disattivato</th>
                    <th>Modifica</th>
                    <th ng-if="!cancelDelete">Elimina</th>
                    <th ng-if="cancelDelete">Annulla</th>
                </tr>

                <tr ng-repeat="news in allNews | filter: deleteTitleText(news)">
                    <td>
                        <div ng-hide="editingData[news.id]">{{ news.title }}</div>
                        <div ng-show="editingData[news.id]"><input type="text" class="form-control" ng-model="news.title" /></div>
                    </td>

                    <td>
                        <div ng-hide="editingData[news.id]">{{ news.arg }}</div>
                        <div ng-show="editingData[news.id]"><input type="text" class="form-control" ng-model="news.arg" /></div>
                    </td>

                    <td>
                        <div ng-hide="editingData[news.id]"><input type="checkbox" disabled ng-model="news.isDeleted"></div>
                        <div ng-show="editingData[news.id]"><input type="checkbox" ng-model="news.isDeleted"></div>
                    </td>

                    <td>
                        <div ng-hide="editingData[news.id]"><button id="modify" class="btn btn-primary" ng-click="modify(news, $event)">Modifica</button></div>
                        <div ng-show="editingData[news.id]"><button id="accept" class="btn btn-success" ng-click="update(news)">Accetta</button></div>
                    </td>

                    <td>
                        <div ng-hide="editingData[news.id]"><button id="delete" class="btn btn-danger" ng-click="delete(news.id)">Cancella</button></div>
                        <div ng-show="editingData[news.id]"><button id="cancel" class="btn btn-danger" ng-click="cancelModify()">Annulla</button></div>
                    </td>
                </tr>
            </table>

JS:

app.filter('deleteTitleText', function () {
return function (news) {
    if (news.isDeleted == true) {
        news.title = "<span><del>" + news.title + "</del></span>";
        news.arg = "<span><del>" + news.arg + "</del></span>";
    }
    return news;
}
});

这是实现这种过滤器的好方法吗?现在我收到此错误:angular.js:13920 Error: [filter:notarray] Expected array but received: function ()。谢谢

【问题讨论】:

  • 为什么需要过滤器,&lt;div ng-hide="editingData[news.id]"&gt;{{ news.title }}&lt;/div&gt; 将其替换为&lt;div ng-hide="editingData[news.id]"&gt;&lt;span ng-hide="news.isDeleted"&gt;{{ news.title }}&lt;/span&gt;&lt;span ng-show="news.isDeleted"&gt;&lt;del&gt;{{ news.title }}&lt;/del&gt;&lt;/span&gt;&lt;/div&gt; 并删除过滤器应该也可以,或者您对使用过滤器有什么特殊要求

标签: angularjs


【解决方案1】:

选项 1:

<table id="tableText" class="table table-hover table-striped" ng-init="allNews()">
    <tr>
        <th>Titolo</th>
        <th>Text</th>
        <th>Disattivato</th>
        <th>Modifica</th>
        <th ng-if="!cancelDelete">Elimina</th>
        <th ng-if="cancelDelete">Annulla</th>
    </tr>

    <tr ng-repeat="news in allNews">
        <td>
            <div ng-hide="editingData[news.id]">
                <span ng-hide="news.isDeleted">{{ news.title }}</span>
                <span ng-show="news.isDeleted"><del>{{ news.title }}</del></span>
                <!-- USING ng-if -->
                <!--
                <span ng-if="!news.isDeleted">{{ news.title }}</span>
                <span ng-if="news.isDeleted"><del>{{ news.title }}</del></span>
                -->
            </div>
            <div ng-show="editingData[news.id]"><input type="text" class="form-control" ng-model="news.title" /></div>
        </td>

        <td>
            <div ng-hide="editingData[news.id]">
                <span ng-hide="news.isDeleted">{{ news.arg }}</span>
                <span ng-show="news.isDeleted"><del>{{ news.arg }}</del></span>
                <!-- USING ng-if -->
                <!--
                <span ng-if="!news.isDeleted">{{ news.arg }}</span>
                <span ng-if="news.isDeleted"><del>{{ news.arg }}</del></span>
                -->
            </div>
            <div ng-show="editingData[news.id]"><input type="text" class="form-control" ng-model="news.arg" /></div>
        </td>

        <td>
            <div ng-hide="editingData[news.id]"><input type="checkbox" disabled ng-model="news.isDeleted"></div>
            <div ng-show="editingData[news.id]"><input type="checkbox" ng-model="news.isDeleted"></div>
        </td>

        <td>
            <div ng-hide="editingData[news.id]"><button id="modify" class="btn btn-primary" ng-click="modify(news, $event)">Modifica</button></div>
            <div ng-show="editingData[news.id]"><button id="accept" class="btn btn-success" ng-click="update(news)">Accetta</button></div>
        </td>

        <td>
            <div ng-hide="editingData[news.id]"><button id="delete" class="btn btn-danger" ng-click="delete(news.id)">Cancella</button></div>
            <div ng-show="editingData[news.id]"><button id="cancel" class="btn btn-danger" ng-click="cancelModify()">Annulla</button></div>
        </td>
    </tr>
</table>

选项 2:

<span ng-bind-html="news | deleteTitleText"></span>

app.filter('deleteTitleText', function ($sce) {
    return function (input) {
        if(input.isDeleted) {
            output = $sce.trustAsHtml("<del>"+input.title+"</del>");
        } else {
            output = $sce.trustAsHtml("<span>"+input.title+"</span>");
        }
        return output;
    };
});

从 ng-repeat &lt;tr ng-repeat="news in allNews"&gt; 中删除过滤器

所以 final 类似于:

<tr ng-repeat="news in allNews">
    <td>
        <div ng-hide="editingData[news.id]">
            <span ng-bind-html="news | deleteTitleText"></span>
        </div>
        <div ng-show="editingData[news.id]"><input type="text" class="form-control" ng-model="news.title" /></div>
    </td>
    ....
    ....

希望对你有帮助

【讨论】:

  • 我更喜欢使用过滤器:也许在发布之前,有人更喜欢改变风格。
  • @MicheleBoscagin - 请检查选项 2,我刚刚添加了一个 sn-p,它需要根据要求进行一些整理
【解决方案2】:

您需要更改过滤器以预期整个 allNews 数组/对象并使用它而不是列表中的单个项目。

This might help

例如:

app.filter('deleteTitleText', function () {
    return function (allNews) {
        var filtered = [];
        angular.forEach(allNews, function(news) {
            if (news.isDeleted == true) {
                news.title = "<span><del>" + news.title + "</del></span>";
                news.arg = "<span><del>" + news.arg + "</del></span>";
            }
            filtered.push(news);
        });
        return filtered;
    }
});

您的 ng-repeat 应更改为:

ng-repeat="news in allNews | filter: deleteTitleText(news)"

收件人:

ng-repeat="news in allNews | deleteTitleText"

【讨论】:

  • 同样的错误:angular.js:13920 Error: [filter:notarray] Expected array but received: function () html 有问题?
  • 我认为这将为news.titlenews.arg 创建一个递归
  • 正确的@Aks1357,只需将news.titlenews.arg 分开即可。
【解决方案3】:

尝试使用 ng 样式,例如在这个 plunker 中:https://plnkr.co/edit/0koMSQ54gUChdpB4Vrrm?p=preview

!item.isDisabled ? {'text-decoration': 'line-through'} : {'text-decoration': 'none'}

【讨论】:

    【解决方案4】:

    您可以简单地使用ng-showng-hide

    <tr ng-repeat="news in allNews">
        <span ng-show="news.isDeleted"><del>{{news.title}}</del></span>
        <span ng-show="news.isDeleted"><del>{{news.arg}}</del></span>
        <span ng-hide="news.isDeleted"><del>{{news.title}}</del></span>
        <span ng-hide="news.isDeleted"><del>{{news.arg}}</del></span>
        .
        .
        .
    </tr>
    

    【讨论】:

    • 我更喜欢使用过滤器:也许在发布之前,有人更喜欢改变风格。
    • 我不太明白原因,但是很抱歉没有提供正确的答案
    • 没问题 :) 对其他人有用!
    猜你喜欢
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多