Javascript 如何在没有指令的情况下在元素上创建隔离范围?

Javascript 如何在没有指令的情况下在元素上创建隔离范围?,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,如果我在指令中使用ngRepeat,它将创建隔离作用域。看看这个例子: <ul> <li ng-repeat="item in model.items"></li> </ul> 想象一下model.items数组有3个项 这将创建3个作用域并将它们绑定到3个li元素。每个li元素在其隔离范围内都有自己的项对象/值。我无法访问此项值,因为li作用域是隔离的 如何在不创建自定义指令和不创建ngRepeat的情况下创建相同的行为?您可以通过

如果我在指令中使用ngRepeat,它将创建隔离作用域。看看这个例子:

<ul>
  <li ng-repeat="item in model.items"></li>
</ul>
想象一下
model.items
数组有3个项

这将创建3个作用域并将它们绑定到3个
li
元素。每个li元素在其隔离范围内都有自己的
对象/值。我无法访问此
值,因为
li
作用域是隔离的


如何在不创建自定义指令和不创建
ngRepeat
的情况下创建相同的行为?

您可以通过指定
ng控制器来隔离元素的范围:

<div ng-controller="MyController">{{ HelloWorld }}</div>

app.controller('MyController', function($scope) {
    $scope.HelloWorld = "Hello, World!";
});
{{HelloWorld}
app.controller('MyController',函数($scope){
$scope.HelloWorld=“你好,世界!”;
});

这就是使用嵌套的div和ng控制器创建隔离作用域的方法:

<div ng-controller="firstControllerScope">
    <h3>First controller</h3>
    <strong>First name:</strong> {{firstName}}<br />

    <div ng-controller="secondControllerScope">
      <h3>Second controller (inside First)</h3>
      <strong>First name (from First):</strong> {{firstName}}<br />
      <strong>Last name (new variable):</strong> {{lastName}}<br />
    </div>
</div>

工作示例是

我想您可能有点困惑,但让我试着把事情弄清楚

首先,ngRepeat是一个指令,因此如果没有指令,就不能将其作为隔离范围的示例!

其次,ngRepeat并没有创建隔离作用域。无法访问
项的原因是它为每个迭代项创建了一个子范围。您不能(有很多方法,但我们可以说,出于您自己的理智,您不能)访问数据父范围->子范围,这就是您的问题所在

如果要手动创建隔离作用域,可以在控制器中执行以下操作:
$scope.$new(true)
,但这确实有具体的原因,而且您尝试实现的目标不太可能需要它

请在此处阅读更多相关信息: $rootScope.Scope#$new

看一看这篇文章,只是为了探索一些范围隔离场景:

我的目标是在ngRepeat指令中的作用域中实现“相同”的行为。我有两个“街区”。这些块显示为ngRepeat now。我现在意识到,一个区块应该有一个额外的按钮。这意味着,这些块不相等,不能用ngRepeat指令显示。我需要两个不同的街区。当然,我可以在html中添加一些条件,并在第二个块中隐藏额外的块(只在第一个块中需要),但这一点都不酷。谢谢你的解释!很难说没有看到更多的细节!正如您所说的,您可能会根据条件执行ng if并包含按钮。这可能是你最好的选择,就像你曾经需要迭代另一个项目,并包括另一个按钮,你可以轻松。这种方法的开销相对较低,您不必重复代码。你为什么反对它?!
var firstControllerScope = function ($scope)
{
  // Initialize the model variables
  $scope.firstName = "John";
};

var secondControllerScope = function ($scope)
{
  // Initialize the model variables
  $scope.lastName = "Doe";
};