Javascript Can';t从指令访问控制器范围

Javascript Can';t从指令访问控制器范围,javascript,angularjs,Javascript,Angularjs,这是我的应用程序配置: angular.module('myApp', ['myApp.directives', 'myApp.controllers', 'myApp.services']); 这是我的控制器: angular.module('myApp.controllers', []) .controller('MainCtrl', function ($scope) { $scope.name = 'world'; }); 这是我的指示: var directiv

这是我的应用程序配置:

angular.module('myApp', ['myApp.directives', 'myApp.controllers', 'myApp.services']);
这是我的控制器:

angular.module('myApp.controllers', [])
  .controller('MainCtrl', function ($scope) {
      $scope.name = 'world';
  });
这是我的指示:

var directives = angular.module('myApp.directives', []);

directives.directive("hello", function () {
    return function (scope, elm, attrs) {
        elm.text("hello, " + scope[attrs.name]);
    };
});
scope.$parent.name
这是我的html:

<div ng-controller="MainCtrl">
    <h1 hello></h1>
</div>

问题在于,angular将指令渲染为:

你好,未定义

而不是:

你好,世界


怎么了?

您正在访问
范围[attrs.name]
,但指令没有为属性
名称提供值

有两种选择:

  • 将指令更改为
    elm.text(“hello,”+scope['name'])
    这不是首选方法,因为它会硬编码到范围属性名称

  • 将html更改为
    。这更好,但我觉得它使用了冗余属性

  • 我建议您将指令更改为
    elm.text(“hello,”+scope[attrs['hello'])

    或者更好的
    elm.text(“hello,+scope.$eval(attrs['hello'])

    这样,您也可以从表达式中获益(例如:

    这样,html将是


    关于attrs参数:它只不过是从dom元素上的属性中提取的字符串的映射。

    您可以使用
    范围访问它。看


    在撰写本文时,您可以做一些在Angular中似乎没有记录的事情(请参见Mark Rajcok的评论:)

    在您的指令范围内:

    var directives = angular.module('myApp.directives', []);
    
    directives.directive("hello", function () {
        return function (scope, elm, attrs) {
            elm.text("hello, " + scope[attrs.name]);
        };
    });
    
    scope.$parent.name
    
    如果在指令的
    范围
    (从指令中)上执行
    控制台.log(范围)
    ,您将看到这些属性

    综上所述,我不知道这是否是“正确的”角度约定,因为这两者都是未记录的,而且我还没有找到其他更好的关于如何访问指令所在控制器的文档。

    我发现了另一种情况:

    如果要访问来自Ajax请求主体的变量,则必须等待变量设置完成

    e、 g:


    这真的很有趣,谢谢!我发现很少有关于使用点语法的文档。这确实是错误的,传递给链接函数的
    scope
    对象与控制器实例化的
    $scope
    对象不同,它是对指令实例化的作用域的只读引用,应该用
    scope
    表示。谁说它是相同的?您不可能仅仅通过编写$scope来访问$scope。这违反了公约。将$放在作用域之前并不意味着它是控制器的作用域对象。@vcardillo很好地添加plunker或问一个问题:)调试后,我意识到我的问题是我在指令定义对象中使用了
    scope:{…}
    attribtue,从而创建了一个新的隔离作用域。我在阻止原型遗传。