Javascript 如何在没有指令的情况下在元素上创建隔离范围?
如果我在指令中使用ngRepeat,它将创建隔离作用域。看看这个例子: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的情况下创建相同的行为?您可以通过
<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";
};