【问题标题】:Isolated scope cannot access variables higher in the scope chain隔离作用域不能访问作用域链中更高的变量
【发布时间】:2014-07-11 16:34:39
【问题描述】:

在有人将此标记为重复之前,我在 SO:上发现了类似的问题:

  1. Isolate scope variable is undefined
  2. unable to access rootscope var in directive scope

但特别是我的问题本身就是一个不同的问题。

我有一个独立范围的指令。在它的后链接函数中,我试图访问一个恰好位于根(最顶层)范围内的变量。在我的隔离范围内,我尝试过myVar: '@'myVar: '=',但它们都不起作用,myVar 在指令范围内是undefined。以下是我的指令的返回语句:

{
    restrict: 'E',
    replace: true,
    transclude: true,
    template: tmpl,

    scope: {
        myVar: '@'
    },

    link: {
        post: function ($scope) {
            // $scope.myVar is undefined
            // $scope.$root.myVar is defined
        }
    }
}

在我的控制台中,我记录了当前作用域对象,我可以将$parent 一直跟踪到根目录并看到 var 在那里,因此也可以通过当前作用域的 $root 访问 var .

我的问题是为什么'@''=' 在这种情况下不起作用?是因为 var 在链中的定义高于直接父级,还是因为中间的某些父级作用域本身就是一个孤立的作用域并破坏了对该 var 的引用链?

【问题讨论】:

  • 你是如何在 html 模板中分配 myVar 的? (顺便说一句,@ 将变量分配给 DOM 属性的值,这永远不会评估为某个 $scope 值)。

标签: javascript angularjs angularjs-directive angularjs-scope


【解决方案1】:

如果您有一个独立的范围,您将希望将您希望它用于my-val 的任何内容传递给您的指令。举个简单的例子,假设我们的 html 中有这个:

 <my-test my-var='{{test}}'></my-test>

我们的主控制器将有一个名为 test 的范围变量。

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

app.controller('MainCtrl', function($scope) {
  $scope.test = 'World';
});

因此,如果您注意到指令设置 my-var = {{test}}

现在我们的指令范围变量myVar 将绑定到该值。

app.directive('myTest', function()  {
  return {
    restrict: 'E',
    replace: true,
    transclude: true,
    template: '<span>{{myVar}}</span>',

    scope: {
        myVar: '@'
    },

    link: {
        post: function (scope) {
            console.log(scope.myVar);
        }
    }
  }
});

这是一个简单的演示:http://plnkr.co/edit/rkbLJ0dJk4OrtyOD3c8w?p=preview

【讨论】:

  • 我明白了,我缺少的关键部分是在 DOM 中声明 var。我期待该指令直接访问其父范围。显然这是不可能的,而且我不想在任何地方声明该 var,因为该指令在多个地方使用......我认为我能做的最好的事情是创建一个提供对该 var 的指令访问的服务。
  • 据我所知,这是可能的,但不是孤立的范围。
  • 这里是一个使用父作用域的例子。 plnkr.co/edit/s8dLh4A6dKY19VWg3vlU?p=preview
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多