2013-10-17 188 views
5

我正在尝试编写我的第一个Angular指令来为我的应用程序添加分页功能。 我现在保持简单,并希望指令只是分享控制器的范围。简单的角度指令

在我的控制,我有一个名为范围的变种:

$scope.pages 

在我的指导的链接功能,我可以这样做:

console.dir($scope) 

看到控制器的范围对象的内容,但如果我尝试访问pages属性,则返回为undefined。

我错过了什么?

在此先感谢。

myDirectives.directive("mdPagination", function(){ 
    return { 
     template: '', 
     restrict: 'A', 
     priority: 1000, 
     scope: false, 
     link: function($scope, el, attrs){ 
      console.dir($scope.pages); //returns undefined 
      el.text('hello world'); 
     }, 
    } 
}); 

编辑:我知道有分页模块在那里,但我的需求是温和的,我想建设自己将开始学习如何建立指令的简单方法。

+0

尝试删除'scope:false' – akonsu

+0

$ scope.pages是如何在你的控制器中填充的?通过AJAX请求? –

+0

查看这些现有的AngularJS分页模块@ http://ngmodules.org/modules?query=pagination –

回答

5

您遇到的问题是链接函数的指令在控制器运行之前运行,因此在此链接阶段通常无法访问范围值。还有其他方法可以做到这一点。解决您的问题最直接的方法是$scope.$watch。所以像这样的东西应该工作:

$scope.watch('pages', function(pages) { 
    console.dir(pages); 
}); 

这适用于迷失的情况。我还建议使用一个属性传递一个表达式(属性名称基本上)为您的手表,从而将控制器从声明的范围中解耦出来。一个简单的例子可能是这样的:

<div my-directive="myProperty"> 

link: function($scope, el, attrs) { 
    $scope.watch(attrs.myDirective, function(value) { 
    //do something you need to do with the value here 
    }); 
} 

但是当你添加复杂的指令,你可能想给你的指令,它自己的控制器来管理状态,而不直接调用手表。该控制器可以使用属于指令本身的子范围scope: true,或者仅使用父范围scope: false。您的选择可能取决于需求。那么你可以有:

myDirectives.directive("mdPagination", function(){ 
    return { 
     template: '', 
     restrict: 'A', 
     priority: 1000, 
     controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) { 
      console.dir($scope.pages); 

     }], 
     link: function($scope, el, attrs){ 
      $element.text('hello world'); 
     } 
    } 
}); 
-1

默认情况下,指令与控制器共享其作用域。要做到这一点,你不得在对象中拥有“范围”属性,如下所示:

myDirectives.directive("mdPagination", function(){ 
    return { 
     template: '', 
     restrict: 'A', 
     priority: 1000, 
     link: function($scope, el, attrs){ 
      console.dir($scope.pages); 
      el.text('hello world'); 
     }, 
    } 
}); 
+0

scope属性没有任何要求与问题。您无法可靠地直接访问链接功能中的$范围值。你必须附上一块手表。 –

-1

@Sandro是对的。您将指令中的scope属性设置为false,这意味着该范围不会继承(或共享)其与控制器的属性。如果你删除了错误,它应该按照你的意图工作。

如何使用$scope的文档是在这里:http://code.angularjs.org/1.2.0-rc.3/docs/api/ng $ rootScope.Scope

开发人员指南创建指令有很多关于良好的信息如何设置你的指令,这样,它给你的范围你想。那些文档在这里:http://code.angularjs.org/1.2.0-rc.3/docs/guide/directive

希望有帮助。

+1

不,如果您将范围设置为“true”,它将为该指令创建一个单独的范围。 http://code.angularjs.org/1.2.0-rc.3/docs/guide/directive –

+2

实际上,它会为继承的指令创建一个子作用域,如果将其设置为false,它会*使用当前的作用域直接声明。公平地说,这是指令设计的一个相当混乱的方面。 –