Возвращаем строку из результата обещания - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу иметь функцию-оболочку для этого $translate сервиса: https://angular -translate.github.io / docs / # / guide / 03_using-translate-service , чтобы мы могли использовать эти функциилегко в нашем коде, вызвав $ language.translate ('ключевое слово') вместо обещания.

Итак, я создаю новый сервис в своем приложении, который должен выполнять эту работу.Это очень простая функция, но она возвращает undefined или [Object Object].

 angularApp.factory("$language", ['$translate', function($translate){

    function trans(keyword){
        console.log("translate in $language", keyword);

        return $translate(keyword).then(function(msg) {
            console.log("translation successfull", msg);
            return msg;
        }, function(translationId){
            console.log("translation is not known", translationId);
            return translationId
        })
    }

    return {
        translate : trans
    }
}]);

В обоих случаях, когда перевод известен или нет, console.log() показывает мне правильную строку, но на моей страницеон показывает [объект объекта] или не определен (когда я удаляю первый return прямо перед $translate(keyword). Когда я использую фильтр, например {{:: "KEYWORD" | translate}}, он работает нормально.

Как я могу позволить моей функции возвращатьстрока с translation или translationId (который фактически совпадает с ключевым словом, когда перевод не найден)?

1 Ответ

0 голосов
/ 13 сентября 2018

Похоже, вы ожидаете, что результат будет синхронным, если вы используете асинхронный вариант, в любом случае он будет возвращать Promise объект.

Похоже, вы могли бы использовать synchronous вариант услуги $translate, используя $translate.instant(), но недостаток этого sync варианта. Вы не получите код ошибки, если что-то произойдет в процессе перевода.

Перепишите

angularApp.factory("$language", ['$translate', '$sce', function($translate, $sce){

    function trans(keyword){
        console.log("translate in $language", keyword);

        var translation = $translate.instant(keyword)
        var msg = $sce.valueOf(translation);
        if (msg) {
            console.log("translation successfull", msg);
            return msg;
        }
        else {
            console.log("translation is not known");
            return "Error"
        }
    }

    return {
        translate : trans
    }
}]);
...