【问题标题】:Angularjs - Function is undefined in child scope even though it is in the parent scopeAngularjs - 函数在子范围内未定义,即使它在父范围内
【发布时间】:2014-05-15 09:35:17
【问题描述】:

我有这个 plunkr:http://plnkr.co/edit/vuN0zVhXNMHUEPMeRvRg?p=preview 在这个 plunkr 中,我调用了一个指令,该指令使用“&”运算符从父作用域获取函数“test”。 为什么当我尝试使用该函数时,它返回“未定义”?

HTML:

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.2.x" src="https://code.angularjs.org/1.2.16/angular.js" data-semver="1.2.16"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p my-directive>Hello {{name}}!</p>
  </body>

</html>

JS:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  $scope.test = function test(){
    alert('y');
  }
  console.log(angular.noop);
  console.log($scope.test);
});


app.directive('myDirective', [
    function () {
      return {
        restrict: 'EAC',
        scope: {
          value: '@', // some value
          test: '&' // the function
        },
        link: function(scope, element, attrs) {
          function functionName(func) {
            var ret = func.toString();
            ret = ret.substr('function '.length);
            ret = ret.substr(0, ret.indexOf('('));
            return ret;
          }
          console.log(scope.test());
        }
      };
    }
  ]);

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    当您使用隔离作用域时,您正在定义父作用域和指令作用域之间的链接在声明指令时通过属性

    所以,这段代码:

    scope: {
              value: '@', // some value
              test: '&' // the function
            },
    

    意思是“在声明指令的元素上查找名为 valuetest 的属性。”

    所以,它期待这个:

      <body ng-controller="MainCtrl">
        <p my-directive value="{{value}}" test="test()">Hello {{name}}!</p>
      </body>
    

    有关文档,请参阅directive documentation 的“隔离指令的范围”部分。

    【讨论】:

      【解决方案2】:

      戴文是绝对正确的。

      当您使用删除指令中定义的范围时,这将完全按照您的预期工作(弹出警报)。

      这是你的 plunker fork:http://plnkr.co/edit/5T9ysjGPBfrhQXRuDGZA?p=preview 可以工作。

      默认情况下,指令的范围继承自它所在的控制器;但是通过在指令上定义范围属性,您创建了一个不从控制器继承的“隔离范围”。

      【讨论】:

        猜你喜欢
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2011-08-30
        相关资源
        最近更新 更多