控制器和指令,优先级

时间:2015-04-30 07:01:55

标签: angularjs angularjs-directive angularjs-service angularjs-controller

我和Angularjs待了几天,我正在努力解决它的一些问题。我将尽力尝试解释问题所在,并且非常感谢任何人都能给我的任何帮助。

我的情况(简化)是这样的:

我有一个服务从json加载一些信息并将其存储在一个对象中。它还有一些函数可供其他控制器检索该信息。

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

particServices.service('particSrv', function() {

  var data = {};

  this.updateData = function(scope) {
    data = // http call, saves in data
  }

  this.getName = function(code) {
    return data.name;
  }

});

我有一个由控制器辅助的html页面,它使用指令板(没有参数,非常简单)。这是控制器:

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

bControllers.controller('bController', ['$scope', 'particSrv', function ($scope, particSrv) {   

$scope.getName = function(code) {   
  return particSrv.getName(code);
};

particSrv.updateData($scope);       

}]);

如您所见,控制器进行调用以初始化服务中的对象。由于这是一个单例,我理解一旦加载了信息,就不需要对updateData进行其他调用,并且该信息可供其他人使用服务中的getter(在这种情况下为getName)。

我有一个非常简单的指令板(我在这里简化),它使用另一个指令bio。

angular.module('tsDirectives',[])

.directive('board', ['dataSrv', 'particSrv', function(dataSrv, particSrv) {

  return {
    restrict: 'E',
    replace: true,
    scope: true,
    controller: function($scope) {                      

      $scope.getName = function(code) { 
        return particSrv.getName(code);
      };

      dataSrv.updateData($scope, 'board', 'U');                             

    },
    templateUrl: '<div class="board"><div bio class="name" partic="getName(code)"/></div></div>'
};      
}]);

这是生物指令:

angular.module('gDirectives', [])

.directive('bio', function() {  

  return {
    scope: {
      partic: '&'
    },          
    controller: function($scope) {          
      $scope.name = $scope.partic({code: $scope.athid});
    },
    template: '<a ng-href="PROFILE.html">{{name}}</a>'
};      
})

现在,我所期望的是,在bio指令中显示了从派对中检索到的信息,但显然在主控制器中初始化粒子之前处理了该指令。

我的印象是,即使处理指令时仍未加载此信息,但只要服务完成且信息准备就绪,就会自动显示在我的指令中,但这似乎不起作用像那样。我一直在阅读关于$ watch和$ digest的内容,但我不明白为什么(以及如果)我需要手动调用它来解决这个问题。

任何提示都将非常感激。如果需要,我可以提供更多技术细节。

2 个答案:

答案 0 :(得分:1)

指令将在加载应用程序时初始化,并且用户打开该指令所在的页面,如果您有一些稍后设置的属性(例如来自api),它将在指令中更新该属性但该指令不会重新初始化($ scope.partic({code:$ scope.athid})不会被调用)。

如果您希望指令等待初始化,则应使用ng-if。像这样:

<div data-directive-name data-some-property="someProperty" data-ng-if="someProperty"></div>

在这种情况下,当(如果)在$ scope.someProperty中有一些值时,将初始化指令。但是,如果某些属性可能存在错误值,则这不是很好 在这种情况下,您需要使用某种加载标志。

答案 1 :(得分:0)

您尚未包含&#34; particServices&#34;作为使用&#34; particServices&#34;服务的其他模块中的依赖项。您的模块应如下所示:

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

angular.module('tsDirectives', ['particServices']);

angular.module('gDirectives', ['particServices']);