我和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的内容,但我不明白为什么(以及如果)我需要手动调用它来解决这个问题。
任何提示都将非常感激。如果需要,我可以提供更多技术细节。
答案 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']);