Немного справочной информации, которая поможет вам понять проблему: Мы используем angularjs, и мы столкнулись с проблемой относительно того, как мы обрабатываем перевод наших предложений на иностранные языки. Наша текущая настройка выглядит следующим образом:Проблемы с привязками внутри вложенных директив
JS-Directive:
Rohan.directive('translate', ['$filter', function ($filter) {
var translateElement = function(element, data, lang){
var results = $filter('I')(element.html(), data, lang);
element.html(results.text);
if (results.tooltip) element.attr('data-tooltip', results.tooltip);
};
return {
restrict: 'A',
link: function (scope, element, attrs) {
translateElement(element, attrs.translate, scope.currentLanguage);
}
}
}
}]);
JS-фильтр:
Rohan.filter('I', [function() {
return function (key, data) {
key = $.trim(key);
var string = "..." + key + "...";
try {
string = Langfile[currentLanguage][key].value;
} catch (e) {
console.warn("Translation not found: " + JSON.stringify(key));
}
return {"text": string};
};
Это в основном просто делает поиск в массиве для правильного перевода. Таким образом, проблема мы сталкиваемся, когда этот тег данных перевода вложен в другие директивы, как так:
JS-Problem Директива
Rohan.directive('easydialog', function() {
return {
restrict: 'E',
transclude: true,
scope: {
text: '@',
showDialog: '=',
useableButtons: '=',
onDialogClicked: '='},
replace: true,
template:
'<div>' +
'<easymodal data-show="showDialog" title="confirm" data-close-function data-dismissable="false" data-modalbig="false">' +
'<button data-ng-repeat="useableButton in useableButtons" data-ng-click="closeWindow(); onDialogClicked(\'{{useableButton}}\')" data-translate>{{useableButton}}</button>' +
'</easymodal>' +
'</div>'
};
});
Выход:
<button>incorrect_input</button>
вместо
<button>Your input is incorrect</button> //Or whatever language is selected
Таким образом, это приводит к угловому разрешению тега преобразования данных f сначала, но в этот момент {{useableButton}} все еще {{useableButton}}, а не значение, которое мы фактически вставляем в это время.
Это можно решить, используя этот фильтр, но мы бы действительно хотели избавиться от него, поскольку это заставляет нас делать разные обходные пути.
Так что я хотел бы видеть это:
- Начало обработки директивы Easydialog.
- Измените {{useableButton}} на все, что находится внутри него.
- Затем запустите шаг перевода данных на все, что находится внутри {{useableButton}}.
Это, возможно, не было ясно, с этим предложением: «Эту проблему можно решить с помощью этого фильтра, но мы на самом деле хотели бы, чтобы избавиться от него, как ему заставляет нас делать разные обходные пути ». Но я не хочу использовать этот фильтр! Это сжимает нас с другими функциями. относительно повторного запуска директивы в случае изменения языка. – Rohan
@Rohan Ах, извините, я явно не уделял достаточного внимания! Не имеет значения, если вы установите «priority: 9000» (или что-то в этом роде) в своей директиве о переводе? – joakimbeng
Я на самом деле пробовал, что, притируя директиву translate, директива получает не определенную {{useableButton}} директиву. В противном случае проблема возникает у меня сейчас. – Rohan