为什么链接函数中没有此范围属性

时间:2013-02-19 09:01:22

标签: javascript angularjs

我正在尝试创建一个指令,我需要一些额外的细节,这些细节必须作为元素的属性传递。

这些值具有静态性质。 ie:父作用域中不会有任何作用域引用(它是一个布尔值)

在指令链接函数中,我需要在指令的链接函数中访问这些属性,但该值是未定义的。

标记:

<div ng-app="myApp">
    <div ng-controller="MainCtrl">
        <div my-directive local-attr="attribute" local-ref="ref">
        </div>
    </div>
</div>

JS:

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

myApp.directive('myDirective', function(){
    return {
        scope: {
            localAttr:'@',
            localRef:'='
        },
        link: function(scope, iElement, iAttrs, controller) {
            console.log(scope.localAttr, scope.localRef);
        }
    };
});

myApp.controller('MainCtrl', ['$scope', function($scope){
    $scope.ref="reg"
}]);

在此演示中,我需要在链接函数中获取attribute的值scope.localAttr

演示:Fiddle

2 个答案:

答案 0 :(得分:2)

如果值为100%静态,则可以使用iAttrs.localAttr(并且可以跳过scope: {..}中的绑定)

如果值应该插值(有{{...}}),您应该使用iAttrs.$observe('localAttr', cb)(并且您也可以跳过在scope: {...}中提及它)

如果您想对其他范围属性进行一些操作,则应$scope.watch('localAttr', cb)

甚至可以预期,在连接期间,范围可能无法完全构建。在AngularJS文档中,关于链接函数的“范围”参数有

  

指令用于注册手表的范围。

http://docs.angularjs.org/guide/directive

所以一般来说,你只能注册观察者,而不能获得价值。

答案 1 :(得分:0)

我要注意,如果这是AngularJS中的错误,或者它是否是预期的行为,但是当链接函数执行时,不会设置scope.localAttr。但是如果您将console.log(scope.localAttr, scope.localRef);更改为:console.log(scope, scope.localAttr, scope.localRef);并检查范围对象,您将看到scope.localAttr已设置,但这似乎发生在自scope.localAttr以来调用链接函数之后链接函数内部未定义。