当前位置: 首页 > 知识库问答 >
问题:

AngularJS中带有ng-repeat作用域的指令隔离作用域

徐承载
2023-03-14

因此,我希望可以使用优先级来确保我的指令首先运行,并最终创建一个隔离范围,当ng-repeat运行时,它重用隔离范围,而不是创建一个原型上从父范围继承的范围。ng-repeat文档声明该指令在优先级1000下运行。尚不清楚1是高优先级还是低优先级。当我在指令中使用优先级1时,没有什么不同,所以我尝试了2000。但这使情况变得更糟:我的双向绑定变成undefined,并且我的指令不显示任何内容。

我创造了一个小提琴来显示我的问题。我已经注释掉了指令中的优先级设置。我有一个name对象列表和一个名为name-row的指令,它显示name对象中的first和last name字段。当单击显示的名称时,我希望它在主作用域中设置一个selected变量。名称数组、selected变量使用双向数据绑定传递给name-row指令。

我知道如何通过调用main作用域中的函数来实现这一点。我还知道,如果selected位于另一个对象内部,并且我绑定到外部对象,事情就会正常工作。但我目前对那些解决方案不感兴趣。

    null

共有1个答案

东郭良弼
2023-03-14

好吧,通过上面的很多评论,我发现了困惑。首先,澄清几点:

  • ngrepeat不影响您选择的隔离范围
  • 传入ngRepeat用于指令属性的参数确实使用了原型继承的作用域
  • 指令不起作用的原因与隔离范围无关

下面是一个相同代码的示例,但删除了指令:

<li ng-repeat="name in names"
    ng-class="{ active: $index == selected }"
    ng-click="selected = $index">
    {{$index}}: {{name.first}} {{name.last}}
</li>

注意,在ngRepeat作用域上创建了一个新的selected属性。控制器作用域003未被更改。

你大概可以猜到当我们点击第二项时会发生什么:

因此,您的问题实际上根本不是由ngRepeat引起的--而是由违反AngularJS中的黄金规则引起的。修复它的方法是简单地使用一个对象属性:

js prettyprint-override">$scope.state = { selected: undefined };
<li ng-repeat="name in names"
    ng-class="{ active: $index == state.selected }"
    ng-click="state.selected = $index">
    {{$index}}: {{name.first}} {{name.last}}
</li>

此外,为了证明这仍然适用于具有隔离作用域的指令(因为,同样,这与您的问题无关),这里也有一个JSFiddle,视图必须反映对象。您将注意到,唯一必要的更改是使用对象而不是原语。

最初的范围:

单击第一项后的作用域:

 类似资料:
  • 问题内容: 我试图在我的指令中使用隔离范围放置一些默认值。基本上,绑定指令后,我需要使用scope对象进行一些DOM操作。下面是我的代码: 控制器: 服务: 指示: 自定义指令元素: 现在,问题是,当尝试在指令内部的默认方法中访问隔离范围时,我在获取数据并将其绑定到DOM的同时获得了未定义的值。如何访问广播侦听器中的隔离作用域并修改指令模板HTML?还有另一个处理这个的麻烦吗? 问题答案: 问题是

  • 问题内容: 给定带有transclude和隔离范围的指令(),当链接该指令时,我具有以下范围: 我期望: 如果同一指令具有 共享作用域 而不是 隔离作用域 ,则可以得到预期的结果。 这给我带来了一个问题,因为,如果被包含的内容包含另一个具有隔离范围的指令(),则会得到: 我想使用这样的指令: 但是,这并不工作,里面,是因为不上合适的范围。 我有两个问题: 如果指令具有隔离的作用域,为什么作用域不是

  • 问题内容: 如果您希望在工作代码中看到问题,请从此处开始:http : //jsbin.com/ayigub/2/edit 考虑以下几乎等效的方式来编写简单的指令: 单独使用时,这两个指令的工作方式和行为相同: 但是,在ng-repeat中使用时,仅快捷方式版本有效: 我的问题是: 为什么长手版本在ng-repeat中不起作用? 您如何在ng-repeat中使用长手版本? 问题答案: 在中,您使用

  • Angularjs ng用div标记重复。。我有一个带有div标记的代码,如图所示。。我想重复整个div,在第二个循环中img src是不同的。。如何使用angularjs中的ng repeat指令执行此操作?

  • 问题内容: 我花了一段时间试图找到一个优雅的解决方案,而我却找到了一个“可行”的解决方案,它感觉不是最简单或正确的做事方式。 所以,我的问题是…如何动态加载指令!在某些情况下,以下是我希望我能摆脱它的方式!除了模板加载之外,我没有包含路由或其他任何内容,而是为下面的控制器分配了ng- controller。 app.js template.html 任何人都可以提供的建议将不胜感激,如果我做任何明

  • 问题内容: 用户故事:当新用户单击“新用户”复选框并接受“条款和条件”单选按钮时,应启用“注册”按钮。 我在angularJS中的代码无法正常工作。“注册”按钮保持禁用状态。想知道出了什么问题? 问题答案: 该表达式在当前范围内进行评估。因此,您只需要以下内容,而无需使用进行任何附加插值: 请注意,我添加了一个,因为如果用户 未 接受TnC,您可能希望禁用该按钮。 工作演示:http : //pl