GVKun编程网logo

angularjs – 当集合发生变化时,ng-repeat是否会保留DOM元素或创建所有新元素?

11

在本文中,我们将带你了解angularjs–当集合发生变化时,ng-repeat是否会保留DOM元素或创建所有新元素?在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的angularjsng

在本文中,我们将带你了解angularjs – 当集合发生变化时,ng-repeat是否会保留DOM元素或创建所有新元素?在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的angularjs ng-repeat无法正确移除通过compile来的元素、angularjs – Angular Js:如何在ng-repeat中找到第一个和最后一个元素,并向他们添加特殊类?、angularjs – Angular ui布局 – 当某些内容发生变化时如何刷新大小?、angularjs – Angular – ui-bootstrap – datepicker – 有没有办法检测月份何时发生变化?

本文目录一览:

angularjs – 当集合发生变化时,ng-repeat是否会保留DOM元素或创建所有新元素?

angularjs – 当集合发生变化时,ng-repeat是否会保留DOM元素或创建所有新元素?

我已经看到很多关于ng-repeat完成的顺序与其他指令或Angular上发生的事情相比的问题,但是我还没有找到答案来确定它是如何完成的.

我有两个关于它如何工作的想法.

第一种方式:
当ng-repeat的观察者触发时,它会删除它从DOM创建的所有元素,然后在其位置创建所有新元素,即使这些元素中的许多元素相同(例如,在将1个项目添加到后备阵列的情况下).

第二种方式:由于ng-repeat已经跟踪哪些元素与其后备集合中的哪些项目相关,因此它只删除集合中不再存在的项目,并为集合中新增的项目创建新元素.

这是为什么?为什么?

这是第二种方式:Angular tries to be smart about creating/removing DOM elements:

The ngRepeat directive provides a way to render a collection of items given a template. To do this,AngularJS compiles the given template and then clones it for each unique item in the collection. As the collection is mutated by the Controller,AngularJS adds,removes,and updates the relevant DOM elements as needed.

But,how does AngularJS kNow which actions to perform when? If you start to test the rendering,you’ll discover that AngularJS doesn’t brute force DOM creation; that is,it doesn’t recreate the DOM for every rendering. Instead,it only creates a new DOM element when a completely new item has been introduced to the collection. If an existing item has been updated,AngularJS merely updates the relevant DOM properties rather than creating a new DOM node.

这仍然会不必要地影响性能,即在集合中传递元素按值时(在上面链接的博客文章中有一个很好的例子).这就是为什么Angular supports “track by” for ngRepeat从版本1.2开始:这是一种帮助Angular决定何时创建DOM的方法:

With this association in place,AngularJS will not $destroy and re-create DOM nodes unnecessarily. This can have a huge performance and user experience benefit.

官方文件states:

You can also provide an optional tracking function which can be used to associate the objects in the collection with the DOM elements. If no tracking function is specified the ng-repeat associates elements by identity in the collection.

For example: item in items track by item.id is a typical pattern when the items come from the database. In this case the object identity does not matter. Two objects are considered equivalent as long as their id property is same.

angularjs ng-repeat无法正确移除通过compile来的元素

angularjs ng-repeat无法正确移除通过compile来的元素

我在用ANGULARJS实现一个TAB控

<ulng-show="panes.length > 0">
    <li ng-repeat="pane in panes track by $index" ng->
      <a href="#" ng-click="select(pane)">
        {{pane.title}}<ing-click="close(pane)"></i>
      </a>
    </li>
  </ul>

<div>
    <ch-pane ng-repeat="pane in panes track by $index" ng-show="pane.selected">
    </ch-pane>
</div>
ch-pane的模板如下

<div>
</div>
只是个占位符,在他link时会动态的往里面加一个由compile来的元素

directive(''chPane'', function($compile) {
    return {
      restrict: "E",
      templateUrl: ''chassis/template/tab_pane.html'',
      link: function(scope, element, attrs) {
        angular.element(element.children()[0]).append($compile(scope.pane.directive)(scope));
      },
    };
  })

下面举个例子,发生了什么

当往panes这个集合中加第一个东西A时,对应的ch-pane假设里面产生了个A1元素,

然后同理加了B,ch-pane产生了个B1,

最后加C,ch-pane产生了个C1,

这时候把A从panes里移除,结果出现的情况是B对应的那个ch-pane里的元素变成了A1,C对应的ch-panes里的元素变成了B1


angularjs – Angular Js:如何在ng-repeat中找到第一个和最后一个元素,并向他们添加特殊类?

angularjs – Angular Js:如何在ng-repeat中找到第一个和最后一个元素,并向他们添加特殊类?

我改变了以下使用角度js
<section id="social">
    <h2>Social Profiles</h2>
    <a href="#"https://www.jb51.cc/tag/irs/" target="_blank">irst"><i></i></a>
    <a href="#"><i></i></a>
    <a href="#"><i></i></a>
    <a href="#"><i></i></a>
    <a href="#"><ihttps://www.jb51.cc/tag/RSS/" target="_blank">RSS"></i></a>
    <div></div>
</section>

对此

<section id="social">
    <h2>Social Profiles</h2>
    <a ng-repeat="sMedia in socialMedia" ng-if="$first" href="#" >
        <i></i>
    </a>
    <div></div>
</section>

一切似乎都很好,除非我找不到一种方法,在ng-repeat的最后一个元素中的第一个元素和class =“last”中添加class =“first”。

只需使用$ first和$ last结合ng-class:
<a ng-repeat="sMedia in socialMedia" ng-https://www.jb51.cc/tag/irs/" target="_blank">irst': $first,'last': $last}" href="#" >

看到他们如何工作:https://docs.angularjs.org/api/ng/directive/ngRepeat

angularjs – Angular ui布局 – 当某些内容发生变化时如何刷新大小?

angularjs – Angular ui布局 – 当某些内容发生变化时如何刷新大小?

我最近开始使用 angular ui-layout
我有一个3窗格视图.最右边的窗格是可选的,有时只显示,我隐藏并用ng-if显示它.

如果ng-if的计算结果为false,则不会重新计算大小,并且中间窗格不会占用水平空间的其余部分.

<ui-layout options="{ flow: 'column' }">
     <div ui-layout-container size="15%"> sidebar </div>
     <div ui-layout-container min-size="65%"> main </div>
     <div ui-layout-container ng-if="haveSelected()" size="20%"> props </div>
</ui-layout>

如果ng-if为false,则main占用侧边栏后面的所有空格,如果它变为true,则第三个窗格的空间被正确分配,但如果它再次变为false,则不回收该空间.

想法?

解决方法

我希望有一个更好的解决方案,但你可以将你的ng-if测试放在两个div上,并使用ui-layout元素进行相反的布尔评估.这对我的情况来说并不是一个糟糕的解决方案,因为我使用的是 Jade.

示例(在Jade中):

ui-layout(options="{ flow: 'column' }",ng-if="showThirdPanel")
  div(ui-layout-container)
    include ./firstPanel.jade
  div(ui-layout-container)
    include ./secondPanel.jade
  div(ui-layout-container)
    include ./thirdPanel.jade
ui-layout(options="{ flow: 'column' }",ng-if="!showThirdPanel")
  div(ui-layout-container)
    include ./firstPanel.jade
  div(ui-layout-container)
    include ./secondPanel.jade

angularjs – Angular – ui-bootstrap – datepicker – 有没有办法检测月份何时发生变化?

angularjs – Angular – ui-bootstrap – datepicker – 有没有办法检测月份何时发生变化?

我想将日期更改为当前所选月份的第1天.

有没有办法监控月份按钮上的点击事件?

TIA
山姆

Datepicker的范围有一个你可以看的属性’activeDateId’.切换月份时会发生变化.

我认为最好的方法是在datepicker指令上创建一个’decorator’,以便为它添加功能.如果覆盖指令的’compile’函数,则可以访问其作用域.

你在module.config函数中执行此操作:

$provide.decorator('datepickerDirective',function($delegate) {
    var directive = $delegate[0];

    /* Override compile */
    var link = directive.link;

    directive.compile = function() {
        return function(scope,element,attrs,ctrl) {
            link.apply(this,arguments);

            scope.$watch('activeDateId',function() {
              console.log('switched');
            });
        }
    };

    return $delegate;
});

编辑

我遇到了与此类似的代码问题,如果您在同一天切换月份和2个月的第一个日期,则$w​​atch将不会触发.你可以通过在Datepicker的控制器中观察属性’activeDate’的值来解决这个问题:

scope.$watch(function() {
              return ctrl.activeDate.getTime();
            },function() {
              console.log('switched');
            });

关于angularjs – 当集合发生变化时,ng-repeat是否会保留DOM元素或创建所有新元素?的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于angularjs ng-repeat无法正确移除通过compile来的元素、angularjs – Angular Js:如何在ng-repeat中找到第一个和最后一个元素,并向他们添加特殊类?、angularjs – Angular ui布局 – 当某些内容发生变化时如何刷新大小?、angularjs – Angular – ui-bootstrap – datepicker – 有没有办法检测月份何时发生变化?等相关内容,可以在本站寻找。

本文标签: