У меня есть компонент локализации, который выглядит так:
(function() {
'use strict';
angular
.module('app.core')
.component('i18n', {
templateUrl: './i18n.html',
bindings: {
code: '@'
},
controller: i18n,
controllerAs: 'vm'
});
i18n.$inject = ['langStrings'];
function i18n(langStrings) {
const vm = this;
this.$onInit = () => {
vm.text = langStrings.get(vm.code);
};
}
})();
Шаблон i18n состоит из одной строки:
{{vm.text}}
Это отлично подходит для отображения строк, но когда я хочу использовать строку в другом компоненте или в шаблоне в качестве заполнителя для тега ввода, я не знаю, как ее применить. Так, например, как мне применить конечный результат компонентов для заполнителя входных данных в другом контексте?
Вход в какой-либо другой компонент или шаблон.
<input
placeholder = "<i18n code='searchPlaceholder'/>"
>
Я использую angularJs 1.7.2
Извините, я дал нечеткие инструкции. Выяснил вопрос.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Атрибут-заполнитель ввода ожидает строку. <i18n> - это компонент, отображающий HTML-элемент, как и его имя (ограничение в директивах, поскольку компонент Элемент действительно действует).
Angular может поддерживать интерполяция для атрибута. так что в основном вам нужно создать что-то вроде placeholder = "{{exp}}", в котором оценка exp должна будет возвращать строку.
{{langStrings.get(v)}} и преобразуйте его в переменную, поэтому используйте placeholder = "{{vm.text}}" или ng-init = "z= lngs('asdf');" placeholder = "{{z}}".попробуйте более простой способ изменить атрибут элементов в директиве с помощью функции ссылки
(function() {
'use strict';
function i18n(langStrings) {
return {
restrict: 'CA',
scope: {
code: '@'
},
link: function(scope, elem, attrs) {
//attrs.$set('placeholder', langStrings.get(scope.code));
// observe changes to interpolated attribute
attrs.$observe('code', function(value) {
let text = langStrings.get(value);
elem.attr('placeholder', text);
});
//https://stackoverflow.com/questions/14876112/angularjs-difference-between-the-observe-and-watch-methods
//scope.$watch('code', function(newval) {
//let text = langStrings.get(newval);
//elem.attr('placeholder', text);
//});
},
}
}
function testCtrl($scope, langStrings) {
$scope.lngs = function(v) {
return langStrings.get(v);
};
return this;
}
angular
.module('app', [])
.component('i18c', {
bindings: {
code: '@'
},
template: function($element, $attrs, langStrings) {
let c = langStrings.get($attrs.code);
return `<input placeholder = "` + c + `">`;
}
})
.directive('i18nCustom', i18n)
.controller('testCtrl', testCtrl)
//i18n.$inject = ['langStrings'];
.factory('langStrings', function() {
this.get = (v) => {
return v + '-transformed';
};
return this;
})
})();<script type = "text/javascript" src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.js"></script>
<body ng-app = "app" ng-controller = "testCtrl">
<input class = "i18n-custom" code='test-class'>
<input i18n-custom code='test-attr'>
<input ng-init = "z = lngs('test ctrl fun');" placeholder = "{{z}}">
<i18c code = "Test Comp"></i18c>
</body>
Разве это не помогает?
placeholder = "{{vm.text}}"