从属性中获取值并使其可供控制器使用?

时间:2014-05-22 21:16:22

标签: javascript angularjs

我想从页面属性或类似的东西中获取一个简单的值,但我正在寻找一种优雅的方法。我想将这个简单的字符串存储在一些常用于控制器和服务的地方。我尝试制作一个简单的属性:

HTML:

<div ng-app="app" site-section="home"> ... </div>

JS:

...
.directive('siteSection', ['$rootScope', function($rootScope) {
  return {
    link: function(scope, element, attrs) {
      $rootScope.siteSection = attrs.siteSection;
    }
  }
}]);

在那个链接函数中我可以将字符串保存到一个简单的服务(或者值提供器对于这种事情更容易接受)但是在控制器运行后调用该链接函数,所以当控制器初始化我的值时是不在那里。

那么做这样的事情的优雅方式是什么?我宁愿不使用ng-init,因为那些可能会变得混乱。

2 个答案:

答案 0 :(得分:1)

您可以使用$timeout服务等待角度如下:

link: function(scope, element, attrs) {
    $timeout(function() {
        $rootScope.siteSection = attrs.siteSection;
    }, 0);
}

或使用scope.$apply

link: function(scope, element, attrs) {
    scope.$apply(function() {
        $rootScope.siteSection = attrs.siteSection;
    });
}

我也认为你不需要注入$rootScope因为你可以使用scope.$root

来访问它

答案 1 :(得分:0)

这是我最终做的...我把属性放在根元素上,然后在工厂中访问$rootElement

...
.factory('currentSection', ['$rootElement', function($rootElement) {

  return $rootElement.attr('site-section');

}]);

让它作为提供者在这里感觉更好,而不是坚持在范围内。我正在使用$ rootElement但没有做任何DOM操作,所以我很好。放入工厂可能有点过头但这很有效!