当前位置: 首页 > 面试题库 >

AngularJS指令滚动到给定项目

海雪松
2023-03-14
问题内容

我有一个在我的控制器中定义的范围变量$ scope.first_unread_id。在我的模板中,我有:

<div id="items" >
  <ul class="standard-list">
    <li ng-repeat="item in items" scroll-to-id="first_unread_id">
    <span class="content">{{ item.content }}</span>
    </li>
  </ul>
</div>

和我的指令看起来像:

angular.module('ScrollToId', []).
directive('scrollToId', function () {
  return function (scope, element, attributes) {
    var id = scope.$parent[attributes["scrollToId"]];
    if (id === scope.item.id) {
      setTimeout(function () {
        window.scrollTo(0, element[0].offsetTop - 100)
      }, 20);
    }
  }

});

它起作用,但是,有两个问题:

  1. 有没有比查询范围。$ parent更好的方法来将“ first_unread_id”从控制器范围内移到直接范围内?这似乎有点“棘手”。我希望我可以将它作为唯一的参数传递给直接视图,而不必在任何li元素上重复。

  2. 有没有更好的方法来避免需要setTimeout()调用?没有它,它 有时会 起作用-我想是由于布局时间的差异。我知道我使用的语法定义了链接功能-但我不清楚默认情况下该链接是前置链接还是后置链接-甚至对我的问题来说也很重要。


问题答案:
  1. 您不需要scope。$ parent-因为它将从父范围继承该值,并且当它在父范围中更改时,它将被向下传递。
  2. 默认值为后链接功能。您是否有一些图像或加载的东西会使初始加载后不久的页面布局发生变化?您是否尝试了没有时间的setTimeout,例如setTimeout(function(){})?这样可以确保在完成所有其他操作之后,可以“一次执行”。
  3. 我还将稍微更改您的指令的逻辑以使其更通用。如果给定条件为真,我将其滚动到该元素。

这是这3项更改:

的HTML:

<div id="items" >
  <ul class="standard-list">
    <li ng-repeat="item in items" scroll-if="item.id == first_unread_id">
      <span class="content">{{ item.content }}</span>
    </li>
  </ul>
</div>

JS:

app.directive('scrollIf', function () {
  return function (scope, element, attributes) {
    setTimeout(function () {
      if (scope.$eval(attributes.scrollIf)) {
        window.scrollTo(0, element[0].offsetTop - 100)
      }
    });
  }
});


 类似资料:
  • 问题内容: 我有这样的设置: 控制器广播事件 指令侦听,然后通过append将其写入DOM,并以此创建指定指令的新元素。 IE浏览器: Angular从未调用过指令 当我检查DOM(并调试)时,我看到Controller 和指令正在执行其工作,并且有新的元素。 什么不见​​了?动态创建这些元素后需要做什么来触发指令调用? 问题答案: 请参阅。您可以类似于以下方式使用此服务: 这将执行新元素的编译和

  • 问题内容: 这里有角的新手。我试图找出将对象传递给指令时出了什么问题。 这是我的指令: 这是我调用指令的模板: 是一组对象。 当我运行此,日志,而日志罚款的范围,甚至有一个与所有的数据,我找孩子。 我不确定我在这里做错了什么,因为这种确切的方法以前对我有用。 编辑: 我已经用所有必需的代码创建了一个插件:http ://plnkr.co/edit/uJCxrG 如您所见,该作用域在范围中可用,但我

  • 问题内容: 我想知道是否有一种方法可以将参数传递给指令? 我想做的是从控制器添加一个指令,如下所示: 是否可以同时传递一个参数,以便我的指令模板的内容可以链接到一个作用域或另一个作用域? 这是指令: 如果我想使用相同的指令但使用$ scope.title2怎么办? 问题答案: 这是我解决问题的方法: 指示 控制者 现在,我可以通过同一指令使用不同的作用域,并动态附加它们。

  • 问题内容: 我正在尝试根据范围值使用不同的模板进行指令。 这是我到目前为止所做的,我不知道为什么它不起作用http://jsbin.com/mibeyotu/1/edit HTML元素: 指示: 问题答案: 1)您正在将内容作为属性传递到html中。试试这个: 代替: 2)指令的数据部分正在被编译,因此您应该使用其他东西。代替数据类型,例如datan-type。 链接在这里: http://jsb

  • 问题内容: 定义angularJs指令时,我们必须以’camelCase’语法的形式对其进行命名,但是当我们使用它时,我们必须以’camel- case’的形式对其进行命名。问题是为什么要这样做? 我知道这是为了避免命名冲突(现在/将来),但是为什么我们在定义和使用时必须使用不同的名称。我们不能直接以“驼峰案例”的形式定义它吗? 问题答案: 它很重要的原因有两个。 首先,HTML属性不区分大小写,

  • 主要内容:AngularJS 指令,AngularJS 实例,数据绑定,AngularJS 实例,重复 HTML 元素,AngularJS 实例,AngularJS 实例,ng-app 指令,ng-init 指令,ng-model 指令,ng-repeat 指令,创建自定义的指令,AngularJS 实例,限制使用AngularJS 通过被称为 指令 的新属性来扩展 HTML。 AngularJS 通过内置的指令来为应用添加功能。 AngularJS 允许你自定义指令。 AngularJS 指令