在指令内创建隔离作用域可以将外部作用域映射到内部作用域。我们已经看到了映射属性的六种不同方法:
这些范围映射选项中的每一个都有什么作用?
如果目标DOM属性的名称与隔离作用域属性名称匹配,则使用4、5和6。下面是下面这个例子的一把小提琴。
<div ng-app='isolate'>
<h3>Outer Scope</h3>
<input type="text" ng-model="myModel" />
<p>msg: {{ msg }}</p>
<h3>Inner Scope</h3>
<div id="inner">
<div my-directive at="{{ myModel }}" equals="myModel" ampersand="msg=msg+'click'"></div>
</div>
</div>
angular.module('isolate', [])
.directive('myDirective', function () {
return {
template:
'<label>@attr</label><input value="{{ myAt }}" />' +
'<label>@</label><input value="{{ at }}" />' +
'<label>=attr</label><input ng-model="myEquals" />' +
'<label>=</label><input ng-model="equals" />' +
'<label>&attr</label><input type="button" ng-click="myAmpersand()" value="Btn" />' +
'<label>&</label><input type="button" ng-click="ampersand()" value="Btn" />',
scope: {
myAt: '@at',
myEquals: '=equals',
myAmpersand: '&ersand',
at: '@',
equals: '=',
ampersand: '&'
}
};
});
这可能会令人困惑,但希望通过一个简单的例子来说明这一点。首先,让我们将模型绑定与行为分离。
这里有一把小提琴,可以帮助把事情联系在一起:http://jsfiddle.net/jeremylikness/3pvte/
并解释。。。如果您的指令如下所示:
<my-directive target="foo"/>
那么您就有了这些范围的可能性:
{ target : '=' }
这将绑定范围。目标(指令)到$范围。foo(外部范围)。这是因为=用于双向绑定,当您不指定任何内容时,它会自动将内部作用域上的名称与指令上的属性名称相匹配。范围的更改。目标将更新$范围。富。
{ bar : '=target' }
这将绑定范围。条形图到$范围。富。这是因为我们再次指定了双向绑定,但告诉指令属性“target”中的内容应该作为“bar”显示在内部范围中。范围的更改。bar将更新$范围。富。
{ target : '@' }
这将设置范围。以“foo”为目标,因为@的意思是“照字面理解”范围的更改。目标不会在您的指令之外传播。
{ bar : '@target' }
这将设置范围。bar为“foo”,因为@从目标属性中获取其值。范围的更改。bar不会在您的指令之外传播。
现在让我们谈谈行为。让我们假设您的外部范围具有以下内容:
$scope.foo = function(parm1, parm2) { console.log(parm1 + ": " + parm2); }
有几种方法可以访问此内容。如果您的HTML是:
<my-directive target='foo'>
然后
{ target : '=' }
将允许您调用scope。从指令中选择目标(1,2)。
同样的事情,
{ bar : '=target' }
允许您调用scope。从您的指令中删除(1,2)。
更常见的方法是将其确立为一种行为。从技术上讲,符号在父表达式的上下文中计算表达式。这很重要。所以我可以:
<my-directive target="a+b" />
如果父作用域有$scope。a=1和$范围。b=2,然后根据我的指示:
{ target: '&' }
我可以调用scope.target(),结果将是3。这很重要——绑定作为函数公开给内部范围,但指令可以绑定到表达式。
更常见的方法是:
<my-directive target="foo(val1,val2)">
然后您可以使用:
{ target: '&' }
并从指令中调用:
scope.target({val1: 1, val2: 2});
这将获取您传递的对象,将属性映射到计算表达式中的参数,然后调用行为,本例调用$scope。foo(1,2);
您也可以这样做:
<my-directive target="foo(1, val)"/>
这会将第一个参数锁定为文字1,并从指令:
{ bar: '&target' }
然后:
scope.bar(5)
也就是scope.foo美元(1,5);
问题内容: 我只知道一个js库,那就是jQuery。 但是我小组中的其他编码人员正在将AngularJS更改为新项目中的默认库。 我对此一无所知。与jQuery有何不同? 我已经为jQuery中的类似任务完成了一组功能。我还能在AngularJS中使用jQuery吗? 问题答案: Angular 1是一个框架,而Angular 2是一个 平台 。(参考) 对于开发人员,Angular2提供了一
问题内容: 我正在尝试制定一条会影响元素宽度/高度的指令。通过示例,我已经看到可以通过引用适当的函数来获取/设置宽度/高度。例如,在指令的链接功能中,我尝试执行以下操作: 但是,在我的代码中,我得到“错误:element.height不是函数”。 我是否缺少对angular.js模块/库的引用,或者文档不是最新的? 问题答案: 如果您不包括jQuery angular替代品,则使用它自己的较小的库
问题内容: 我有一个充满小写和大写数据的json。例如 : 而且我有类似的东西: 我想做的是搜索朋友,而不用看大写和小写。因此,基本上,当我在输入中键入“ John”,“ JOHN”或简单地输入“ john”时,它应该返回我的朋友John。 那么是否可以将不区分大小写的选项应用于过滤器? 问题答案: 将您在使用字符串的toLowerCase的适用范围内定义的函数名称传递给您。参见ngFilter。
问题内容: 我正在尝试使用AngularJS bootstrap.ui显示模式对话框。当我执行$ modal.open(…)时,屏幕变灰,并且我的templateUrl中的html从服务器调用,但是没有模式显示。当我单击灰色区域时,模态“关闭”,即灰色区域消失,屏幕再次看起来正常。我无法弄清楚为什么看不到任何模态屏幕。 我正在尝试遵循本教程: Angular指令 我正在使用Visual Studi
问题内容: 尝试滤除具有非null的特定属性的项目 我只想显示一个李;一个给萨莉。这是我没有成功的尝试 您知道如何在不创建自定义过滤器的情况下执行此操作吗?甚至如此,自定义过滤器会是什么样? 问题答案: 根据https://github.com/angular/angular.js/issues/11573(对于Angular> = 1.4),建议使用’‘,它匹配除null / undefined
问题内容: 如何呈现以下选项列表的值? 预期结果(预期为value =“ limit.value”: 结果: 问题答案: 该指令未在元素上设置属性。它始终使用序列。 使用方式: 将的标签设置为 将值保存到选择的 检查此小提琴:http : //jsfiddle.net/bmleite/k58Hw/