为什么隔离范围(=)不使用字符串?

时间:2016-06-29 03:28:23

标签: javascript angularjs

我是棱角分明的新人。我阅读了很多关于指令隔离范围@ / =之间差异的博客,但我仍感到困惑。 这是我试过的一个小例子。

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<!DOCTYPE html>
<html ng-app="myApp">
<head>
  <title>Directive Test</title>
  
  <script type="text/javascript">
    var app = angular.module('myApp', []);
    app.controller('MyCtrl', ['$scope', function ($scope) {

    }]);
    app.directive('personInfo', [function () {
      return {
        restrict: 'EA',
        scope: {
          name: '=',
          age: '='
        },
        template: "My name is {{name}} . My age is {{age}}",
        link: function (scope, iElement, iAttrs) {
          console.log(scope.name);
        }
      };
    }])
  </script>
</head>
<body ng-controller="MyCtrl">
  <person-info name="deepak" age="25"></person-info>
</body>
</html>

输出:

My name is . My age is 25

我不明白为什么名字是undefined,年龄为25岁。 当我在做name: @时,一切正常。

我不确定为什么=使用数值但不能使用字符串。我知道@用于单向,而=用于双向绑定,但在我的例如,我与父范围无关。

2 个答案:

答案 0 :(得分:4)

=是一个双向绑定,因此当您使用字符串时,它认为您正在尝试传递名为deepak的范围变量。要传递字符串,必须将它们用引号name="'deepak'"包装。

数字起作用的原因是因为变量不能以数字开头,所以它们被解释为一个值。

如果使用@,它将是一个单向绑定,不能传递范围变量。这只会让您传递值,因此name="deepak"name="{{somevar}}"将起作用。

答案 1 :(得分:1)

如果使用=,则该指令期望后面的表达式有一个范围变量。

所以<person-info name="deepak">通过$scope.deepak告诉你有角度查找null,在这种情况下等于=,结果就是结果。

我想如果你输入数字是有效的,因为你不能用纯数字来命名变量,所以它会做一些聪明的猜测来替换你的值。

要在使用<person-info name="'deepak'">时使用文字字符串,您需要添加额外的引号层 packages: yum: gcc-c++: [] make: [] sources: /home/ec2-user: http://download.redis.io/releases/redis-2.8.4.tar.gz commands: redis_build: command: make cwd: /home/ec2-user/redis-2.8.4 redis_config_001: command: sed -i -e "s/daemonize no/daemonize yes/" redis.conf cwd: /home/ec2-user/redis-2.8.4 redis_config_002: command: sed -i -e "s/# maxmemory <bytes>/maxmemory 500MB/" redis.conf cwd: /home/ec2-user/redis-2.8.4 redis_config_003: command: sed -i -e "s/# maxmemory-policy volatile-lru/maxmemory-policy allkeys-lru/" redis.conf cwd: /home/ec2-user/redis-2.8.4 redis_server: command: src/redis-server redis.conf cwd: /home/ec2-user/redis-2.8.4