Angular指令不更新范围

时间:2015-04-28 12:56:20

标签: angularjs

我正在编写一个指令来访问服务以获取页面的翻译字符串。该服务将在加载页面时调用服务器并返回字符串,它与控制器一起工作,显示一切正常,但在指令中不起作用。

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

1 个答案:

答案 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的假设。