Я создал директиву, и я считаю, что двухсторонняя привязка прерывается, когда я устанавливаю переменную связанной области (textStyleOriginal) в null
. Каков хороший способ решить эту проблему?
.directive('textStylePalette', function($log, toastr, _){
return {
restrict: 'E',
templateUrl: 'app/palettes/text/text-style-palette.html',
scope: {
textStyleOriginal: '=textStyle'
},
link: textPaletteLinkFn
};
function textPaletteLinkFn(scope, elem, attr) {
scope._ = _;
scope.textStyle = null;
// Used when closing the palette
scope.deselectStyle = function() {
// I BELIEVE THE PROBLEM IS THE NEXT LINE
scope.textStyleOriginal = null;
scope.textStyle = null;
};
...
// THIS WATCH STOPS WORKING.
scope.$watch('textStyleOriginal', function(newVal, oldVal){
$log.debug('n: ' + newVal + '|o: ' + oldVal );
debugger;
if (newVal && newVal !== oldVal) {
...
}
});
}
Html, где привязка первоначально подключена, выглядит следующим образом:
<text-style-palette ng-show="selectedStyle !== null" text-style="selectedStyle">
</text-style-palette>
Через несколько минут после того, как я задал вопрос, я попробовал что-то, что, казалось, сработало. Оставив этот вопрос, чтобы подтвердить свой ответ:
В основном это было просто: "всегда делайте переданные переменные сферы как часть объекта".
Я сделал некоторые изменения, так что внешний selectedStyle, который кормил директивы, был частью объекта. здесь код
<cm-text-style-palette ng-show="selections.selectedStyle !== null" text-style="selections.selectedStyle">
</cm-text-style-palette>
Обратите внимание на то, что это выбор.selectedStyle не только selectedStyle.
Проблема связана с тем, как работает указатель переменной. Для получения дополнительной информации это видео может помочь: https://egghead.io/lessons/angularjs-the-dot#/tab-transcript
Удачи вам в ваших проектах!
Кажется, я знаю, в чем проблема.
Поскольку у вас изолированная область, у вас будет набор textStyleOriginal
из родительской области. Это означает, что если вы переопределите его значением null
, вы потеряете ссылку на исходный объект. Например, даже если вы измените свой textStyleOriginal
в своей родительской области, это не будет иметь никакого эффекта в вашей директиве, поскольку вы уже потеряли ссылку на него.