2016-07-23 79 views
0

我有一个场景,当我的鼠标输入一些文本我需要得到一个输入框和文本应该隐藏,当我离开文本框框应该隐藏,我应该显示文本回老鼠离开不能正常工作

,但这是不会发生

的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

任何帮助表示赞赏。

+0

请这个小提琴http://jsfiddle.net/dMTc2/17/ –

+0

能否请你说明我要去的地方错了@CemArguvanlı –

回答

2

问题是你的原始值是ng-if指令,你知道ng-if在DOM上呈现该元素时确实会创建子范围。要解决这个问题,我建议你要做的是,通过定义新的对象,按照Dot Rule。然后定义您想在该对象内使用的所有属性。

如果您想深入了解范围继承的工作方式,您可以参考this answer

所以在你的代码中,你应该定义一个对象,假设它是$scope.model = {},然后在该对象本身中有showme属性。无论你在哪里使用showme,请用model.showme替换。

Demo Fiddle


更方便的方式来解决这类范围继承问题是,你可以使用controllerAs模式。在那里你不使用$scope里面的控制器,你只需放置控制器上下文this。在视图上使用控制器时,您需要创建别名,并且当您想要获取变量值时,可以使用变量引用。

+0

由于其现在的工作 –

+1

@Shikhathakur乐意帮助你,看看更新的答案,会帮助你更清楚的理解。阅读推荐的答案,以及:)谢谢:) –

1

问题是你有多个嵌套作用域。在输入框中设置的showme与在p中设置的showme不同。发生这种情况是因为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> 

事实上,作为一个一般的经验法则,从来没有访问的范围,因为它是非常困难的,以确保您的访问,你以为你是范围:

试试这个访问。始终通过您正在使用的控制器访问属性。

+0

感谢它现在的工作@Andrew Eisenberg –