在没有数据绑定的情况下呈现值

IT技术 javascript angularjs data-binding
2021-02-06 06:51:37

在 AngularJS 中,如何在没有 2 路数据绑定的情况下呈现值?人们可能出于性能原因想要这样做,或者甚至在给定的时间点渲染一个值。

以下示例均使用数据绑定:

<div>{{value}}</div>

<div data-ng-bind="value"></div>

如何在value 没有任何数据绑定的情况下进行渲染

5个回答

角 1.3+

在 1.3 中,Angular 使用以下语法支持这一点。

<div>{{::message}}</div>

正如这个答案中提到的


Angular 1.2 及以下

这很简单,不需要插件。看一下这个。

这个小指令将轻松完成您想要实现的目标

app.directive('bindOnce', function() {
    return {
        scope: true,
        link: function( $scope ) {
            setTimeout(function() {
                $scope.$destroy();
            }, 0);
        }
    }
});

你可以像这样绑定一次

<div bind-once>I bind once - {{message}}</div>

你可以像平常一样绑定

<div ng-bind="message" bind-once></div>

演示:http : //jsfiddle.net/fffnb/

你们中的一些人可能正在使用 angular batarang,并且如评论中所述,如果您使用此指令,则该元素仍然显示为绑定,而不是,我很确定这与附加到元素的类有关,所以试试这个,它应该可以工作(未测试)如果它对你有用,请在评论中告诉我。

app.directive('bindOnce', function() {
    return {
        scope: true,
        link: function( $scope, $element ) {
            setTimeout(function() {
                $scope.$destroy();
                $element.removeClass('ng-binding ng-scope');
            }, 0);
        }
    }
});

@x0b:如果您有强迫并且想要删除空class属性,请执行此操作

!$element.attr('class') && $element.removeAttr('class')
毫无疑问,这是因为如果您可以轻松删除 ng-binding 类
2021-03-18 06:51:37
我还没有测试插件,但我认为 AngularJS chrome 工具不会将绑定一次元素显示为绑定,就像你的例子那样。有趣的方法,我将很快测试这两种方法。
2021-03-23 06:51:37
这比 bindonce 插件很棒而且简单得多。我添加了在破坏范围之前等待条件的能力,这真的很有帮助。谢谢。
2021-03-26 06:51:37
2021-03-30 06:51:37
@Connor 我不同意。例如,我从 REST API 接收视频对象 ($scope.video),并且我想要一次性绑定视频标题 ($scope.video.title)。即使我在将它添加到控制器的范围之前解决了Promise,我仍然必须在 DOM 上声明 ng-bind="video.title" bind-once。现在,在 promise 得到解决之前, video.title 是未定义的,并且在 video.title 定义之前范围被破坏。我对此的一个解决方案是将元素包装在某种类型的加载/初始化标志中,ng-if="someLoadingFlag",但这是一个糟糕的模式。
2021-04-11 06:51:37

看起来 Angular 1.3(从 beta 10 开始)内置了一次性绑定:

https://docs.angularjs.org/guide/expression#one-time-binding

一次性绑定

以 :: 开头的表达式被视为一次性表达式。一次性表达式一旦稳定就会停止重新计算,如果表达式结果是一个未定义的值(参见下面的值稳定算法),这会在第一次摘要之后发生。

哇,我真的很高兴我向下滚动。我要请康纳在他接受的答案中引用这一点。
2021-03-15 06:51:37
@billy-g 你能发布一个 jsfiddle 或 plunker 来说明这个问题吗?
2021-03-19 06:51:37
@James Daily:这里是“正常”案例plnkr.co/edit/rCRP0T5fSgNIllx7F27y,这里是“一次性表达”案例plnkr.co/edit/Rd5VBVjkcX3sTJYGypUr但是......我无法在那里重现它。无论如何,“一次性表达式”并没有更快,我必须做更多的调查才能找出它在我的环境中发生的原因(我使用 angularjs 的 1.3 beta 18)
2021-04-09 06:51:37
我有一个包含 2000 行的表格/列表,并且使用一次性绑定运算符时,我的应用程序在第一次显示/呈现列表时变得非常慢。太慢了,浏览器问我两三遍是否要停止执行脚本!
2021-04-12 06:51:37
这个答案一次又一次。卡尔,我怎么赞美你都不为过!我强烈建议在有意义的地方积极使用此功能。
2021-04-14 06:51:37

使用绑定module您需要包含 JS 文件并将其作为依赖项添加到您的应用程序module:

var myApp = angular.module("myApp", ['pasvaz.bindonce']);

这个库允许你渲染只绑定一次的项目——当它们第一次初始化时。对这些值的任何进一步更新都将被忽略。对于在呈现后不会更改的内容,这是减少页面上观看次数的好方法。

用法示例:

<div bo-text="value"></div>

像这样使用时,value一旦可用,将设置下的属性,但随后将禁用手表。

我正要写一个答案“写你自己的指令......”,但看起来有人已经为我们做了,很好。
2021-03-16 06:51:37
Bindonce 非常有用,它可以作为内置的可选库包含在内,例如$resource.
2021-03-16 06:51:37
这就是我一直在寻找的东西,但是我期待将这样的东西内置到 angular 中!
2021-03-19 06:51:37

@OverZealous 和 @Connor 答案之间的比较:

使用 angular 的传统 ngRepeat:2000 行需要 15 秒,RAM 需要420 个月(Plunker

使用 ngRepeat 和 @OverZealous module:2000 行 7s 和 240mo 内存(Plunker

使用 ngRepeat 和 @Connor 指令:2000 行 8s 和 500mo 内存(Plunker

我使用 Google Chrome 32 进行了测试。

谢谢,不要忘记包含angular-once包(我已将其发布为此处的替代选项)。
2021-03-15 06:51:37
@alecxe:我计划在 AngularJS 1.3 的稳定版本发布时进行测试。
2021-03-24 06:51:37
也可以angular-once进行比较就好了谢谢。
2021-04-10 06:51:37

作为替代,有angular-once包:

如果你使用 AngularJS,有性能问题并且需要显示大量只读数据,这个项目适合你!

angular-once实际上受启发bindonce并提供了类似的once-*属性:

<ul>
    <li ng-repeat="user in users">
      <a once-href="user.profileUrl" once-text="user.name"></a>
        <a once-href="user.profileUrl"><img once-src="user.avatarUrl"></a>
        <div once-class="{'formatted': user.description}" once-bind="user.description"></div>
    </li>
</ul>