AngularJS:如何进行ng-bind逻辑检查?

时间:2015-04-27 19:47:00

标签: javascript angularjs angularjs-ng-repeat angularjs-ng-model

我有一些推文数据,有时数据库会根据服务器(本地,制作等)返回不同的JSON对象。

有时,推文内容位于tweets[i].text,有时位于tweets[i].highlights.text

我目前的加价:

<section ng-repeat="t in tweets">
    <div ng-bind-html="t.text">{{t.text}}</div>

    <!-- <div ng-bind-html="t.highlights.text">{{t.highlights.text}}</div> -->

如果ng-bind存在,是否有办法检入t.text?如果没有,那么将模型设置为t.highlights.text

NG-如果:

在div上使用ng-if呈现列表中的实际推文:

<section ng-repeat="t in tweets" class="social-content">
    <a href="http://twitter.com/{{t.fields.user_name}}/status/{{t.id}}" target="_blank">
        <header>
            <em>+</em>
            <span>@{{t.fields.user_name}}</span>
        </header>
        <div class="body" ng-if="t.text != undefined" ng-bind-html="t.text">{{t.text}}</div>
        <div class="body" ng-if="t.highlights.text != undefined" ng-bind-html="t.highlights.text">{{t.highlights.text}}</div>
    </a>
    <time>{{t.fields.formatted_date_difference}} ago</time>
</section>

2 个答案:

答案 0 :(得分:3)

根据Ben的建议,这根本不应该在视图中,它应该在控制器中,它负责呈现视图渲染的数据模型。

$scope.tweets.forEach(function(t) {
    t._content = t.text || t.highlights.text || '';
});

然后在您的视图中呈现t._content,而不是t.text等。

答案 1 :(得分:2)

控制器:

$scope.isHighlights = false;

$scope.tweets = [];

$scope.getTweets = $http.get('url').then(function(data){
   //Get first tweet and set isHighlighted bool based on the property being defined
    $scope.isHighlighted = angular.isDefined(data[0].highlights);
    $scope.tweets = data;
});

查看:

<div data-ng-if="isHighlights">
    <section data-ng-repeat="t in tweets">{{t.highlights.text}}</section>
</div>

<div data-ng-if="!isHighlights">
    <section data-ng-repeat="t in tweets">{{t.text}}</section>
</div>

内存更轻,绑定更少,并且更容易阅读其他人签出代码。有一百万种皮肤养猫的方法。这种方式假设它们都是一种格式或另一种格式,并且在一个屏幕上可能会有很多推文。