У меня есть сценарий, когда, когда я нажимаю на какой-то текст, мне нужно получить поле ввода, а текст должен скрываться, и когда я покину текстовое поле, ящик должен скрыться, и я должен показать текст обратно
но этого не происходит
Html
<div ng-app>
<div ng-controller="showCrtl">
<div ng-hide="showme">
<p ng-mouseenter="showme=!showme">
mouse enter
</p>
</div>
<input type="search" ng-if="showme" ng-mouseleave="showme=false">
</div>
</div>
JS:
function showCrtl($scope){
$scope.showme=false;
}
Вот что я пробовал DEMO
Любая помощь приветствуется.
Проблема в том, что у вас было примитивное значение в директиве ng-if
, вы знаете, что ng-if
создает дочернюю область, когда он отображает этот элемент в DOM. Чтобы решить эту проблему, я предлагаю вам сделать это, просто следуйте Dot Rule
, определяя новый объект. Затем определите все свойства, которые вы хотите использовать внутри этого объекта.
Если вы хотите, пошаривайте глубже, как работает наследование областей, вы можете обратиться к этому ответу.
Таким образом, в вашем коде вы должны определить объект, например, $scope.model = {}
а затем иметь свойство showme
внутри самого объекта. И везде, где вы используете showme
на виду, замените это на model.showme
.
Более удобный способ решения такого рода вопросов наследования наследования заключается в том, что вы можете использовать шаблон controllerAs
. В том, что вы не используете $scope
внутри контроллера, вы просто место с контекстом контроллера this
. При использовании контроллера на представлении вам нужно создать его псевдоним, и когда вы захотите получить значение переменной, вы можете использовать ссылку на переменную.
Проблема в том, что у вас есть несколько вложенных областей. showme
, которое задается в поле ввода, отличается от showme
, установленного в p
. Это происходит потому, что Angular неявно добавляет новую область для многих встроенных директив (ng-if является одним из них).
Вы должны быть уверены, что вы всегда устанавливаете и читаете одно и то же свойство showme
. Самый простой способ сделать это - добавить свойство showme
в контроллер.
Попробуй это:
<div ng-app>
<div ng-controller="showCrtl">
<div ng-hide="showCrtl.showme">
<p ng-mouseenter="showCrtl.showme=!showCrtl.showme">
mouse enter
</p>
</div>
<input type="search" ng-if="showCrtl.showme" ng-mouseleave="showCrtl.showme=false">
</div>
</div>
Фактически, как общее правило, никогда не обращайтесь к области непосредственно в ваших шаблонах, так как очень трудно убедиться, что вы обращаетесь к области, к которой, по вашему мнению, обращаетесь. Всегда обращайтесь к свойствам через контроллер, с которым вы работаете.