首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AngularJS:=&@在指令作用域中的区别?

AngularJS:=&@在指令作用域中的区别?
EN

Stack Overflow用户
提问于 2014-02-12 04:18:15
回答 2查看 50.2K关注 0票数 111

在指令中创建可以让我们将外部作用域映射到内部作用域。我们已经看到了六种不同的映射到attrbutes的方法:

  1. =attr
  2. &attr
  3. @attr
  4. =
  5. &
  6. @

这些作用域映射选项都有什么作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-12 06:58:19

这可能会令人困惑,但希望一个简单的例子可以澄清这一点。首先,让我们将模型绑定与行为分开。

这里有一把小提琴,可以帮助把事情联系在一起:http://jsfiddle.net/jeremylikness/3pvte/

并解释说..。如果您的指令如下所示:

代码语言:javascript
复制
<my-directive target="foo"/> 

那么你有这些可能的作用域:

代码语言:javascript
复制
{ target : '=' } 

这将把scope.target (指令)绑定到$scope.foo (外部作用域)。这是因为=用于双向绑定,当您不指定任何内容时,它会自动将内部作用域上的名称与指令上的属性名称进行匹配。对scope.target的更改将更新$scope.foo。

代码语言:javascript
复制
{ bar : '=target' } 

这将把scope.bar绑定到$scope.foo。这是因为我们再次指定了双向绑定,但是告诉指令"target“属性中的内容应该在内部作用域中显示为"bar”。对scope.bar的更改将更新$scope.foo。

代码语言:javascript
复制
{ target : '@' } 

这会将scope.target设置为"foo“,因为@表示”按字面意思理解“。对scope.target的更改不会传播到您的指令之外。

代码语言:javascript
复制
{ bar : '@target' } 

这会将scope.bar设置为"foo“,因为@从目标属性中获取它的值。对scope.bar的更改不会传播到您的指令之外。

现在让我们来讨论一下行为。让我们假设你的外部作用域是这样的:

代码语言:javascript
复制
$scope.foo = function(parm1, parm2) { console.log(parm1 + ": " + parm2); } 

有几种方法可以访问它。如果您的HTML是:

代码语言:javascript
复制
<my-directive target='foo'>

然后

代码语言:javascript
复制
{ target : '=' } 

将允许您从指令中调用scope.target(1,2)。

同样的事情,

代码语言:javascript
复制
{ bar : '=target' }

允许您从指令中调用scope.bar(1,2)。

更常见的方法是将其建立为一种行为。从技术上讲,“与”在父级上下文中对表达式求值。这一点很重要。所以我可以:

代码语言:javascript
复制
<my-directive target="a+b" />

如果父作用域的$scope.a =1和$scope.b = 2,那么在我的指令中:

代码语言:javascript
复制
{ target: '&' } 

我可以调用scope.target(),结果将是3。这一点很重要-绑定作为内部作用域的函数公开,但指令可以绑定到表达式。

一种更常见的方法是:

代码语言:javascript
复制
<my-directive target="foo(val1,val2)"> 

然后,您可以使用:

代码语言:javascript
复制
{ target: '&' }

并从指令中调用:

代码语言:javascript
复制
scope.target({val1: 1, val2: 2}); 

这将获取您传递的对象,将属性映射到计算表达式中的参数,然后调用行为,本例调用$scope.foo(1,2);

你也可以这样做:

代码语言:javascript
复制
<my-directive target="foo(1, val)"/>

这在第一个参数中锁定为文字1,并且来自指令:

代码语言:javascript
复制
{ bar: '&target' }

然后:

代码语言:javascript
复制
scope.bar(5) 

它将调用$scope.foo(1,5);

票数 203
EN

Stack Overflow用户

发布于 2014-02-12 06:17:42

摘要

  1. @attr绑定到匹配DOM属性的作用域value.
  2. =attr绑定到匹配DOM属性的作用域property.
  3. &attr绑定到匹配DOM属性的作用域function.
  4. @
  5. =
  6. &

字符串

如果目标DOM属性的名称与作用域属性名称匹配,则使用4、5和6 DOM。以下是以下示例的工作。

Html

代码语言:javascript
复制
<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>

Javascript

代码语言:javascript
复制
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: '&ampersand',
            at: '@',
            equals: '=',
            ampersand: '&'
        }
    };
});
票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21712147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档