我正在编写一个指令来访问服务以获取页面的翻译字符串。该服务将在加载页面时调用服务器并返回字符串,它与控制器一起工作,显示一切正常,但在指令中不起作用。
var blockUserAction = function () {
return {
restrict: 'AE',
replace: 'true',
scope: {
theirId: "=theirId"
},
controller: function ($scope, translationsService) {
translationsService.init(); //does http request. Already called on mod.run() so redundant here.
$scope.caption = translationsService.translations.Conversation.OptionsMenu.BlockUser.value;
$scope.btnClick = function () {
debugger;
};
},
template: "<a href='#' data-ng-click='btnClick()'>{{caption}}</a>"
};
}
我已经调用了module.run()上的translations.init()并与控制器一起工作,但我再次在这里调用它以查看是否有帮助......它确实没有。我可以通过调试btnClick()来看到,一旦服务返回字符串,对象就会被更新,所以&#34; translationsService.translations.Conversation.OptionsMenu.BlockUser.value&#34;有它的价值,但$ scope.caption还没有更新。
我一直在玩watch()和apply(),但我觉得我复杂的事情应该像访问服务一样简单,这是一个单身人士,并且得到价值。
hisId是父控制器通过视图在指令标记上设置的值,因此指令不需要知道谁在使用它,它只需要id和对要使用的服务的访问权限:翻译和配置文件(删除这一个以简化atm)服务。
示例:
<a block-user-action theirId="5"></a>
有没有人知道我是应该打电话观看/申请还是设置不同,或者这只是一个错误,因为主控制器似乎没有任何问题,但另一个呢?
此外,该指令已被声明为主模块的一部分,因此它应该可以毫无问题地访问服务:
app.directive('blockUserAction', blockUserAction);
app.run(function(messagingTranslations){
messagingTranslations.init();
})
更新
translations.init():
var messagingTranslations = function (globalizationService) {
return {
init: function () {
globalizationService.setTranslations(this.translations);
},
translations: new function () {
...
}
};
};
名为:
的服务方法this.setTranslations = function (list) {
var ids = getListOfIds(list);
return getTranslationsFromServer(ids).then(function (response) {
setTranslationValues(list, response);
return list;
});
}
UPDATE2
我已经设置了关于翻译...值和console.log的所有内容我可以看到创建了该指令,范围分配给空字符串(默认值)并且在所有这一切发生之后解雇了...但是没有价值?
var myDirective = function () {
return {
restrict: 'AE',
replace: 'true',
scope: {
theirNoid: "=theirNoid"
},
controller: function ($scope, translationsService) {
translationsService.init();
console.log("init called");
$scope.$watch('translationsService.translations.Conversation.OptionsMenu.BlockUser.value', function () {
console.log('hey, myVar has changed!: ' + translationsService.translations.Conversation.OptionsMenu.BlockUser.value);
});
$scope.caption = translationsService.translations.Conversation.OptionsMenu.BlockUser.value;
console.log("caption set");
$scope.btnClick = function () {
console.log('I clicked the button and the value is: ' + translationsService.translations.Conversation.OptionsMenu.BlockUser.value);
};
},
template: "<a href='#' data-ng-click='btnClick()'>{{caption}} eee</a>"
};
}
日志:
init called
caption set
hey, myVar has changed!:
但如果我点击按钮,则日志为:
I clicked the button and the value is: Block user
答案 0 :(得分:0)
通常当您发出http请求时,呼叫将立即返回,并且工作在后台完成。可能是您正在初始化 translationsService.translations.Conversation.OptionsMenu.BlockUser.value 在进行http调用之前为null,因为通过将 $ scope.caption设置为null ,调用立即返回其余的代码流。当然,translationsService.translations.Conversation.OptionsMenu.BlockUser.value将在稍后更新,但$ scope.caption仍将保持为null。
同样,这是基于您在 translationsService.init()中使用http调用并且未正确处理返回的promise的假设。