我有一个Angular JS应用,其中页眉和页脚是index.html的一部分,视图在两者之间动态加载。我在控制器的作用域上有一个signOut()
函数,它对REST API进行适当的调用以注销用户。但是,"Sign out"按钮是标题的一部分,所以我有麻烦让它调用signOut()
函数。
<button>
标签中的ng-click="signOut()"
绝对没有做任何事情,大概是因为按钮在shell页面中,而不是视图之一,因此无法访问范围。
或者使用ng-click
,我尝试在我的视图中放置一些代码,以便在单击按钮时调用signOut()
函数,因为我知道我可以通过DOM访问它。我第一次尝试的是:
<script>
$('#logoutbutton').on('click', function(){
{{signOut()}};
console.log("signout clicked");
});
</script>
但是这会抛出Uncaught ReferenceError: signOut is not defined
,因为在<script></script>
标签中显然无法访问范围。出于同样的原因,我怀疑
<script>
$('#logoutbutton').on('click',
{{signOut()}}
);
</script>
将不能工作,即使尝试使用该代码抛出语法错误(Unexpected token '{'
)。
我试图找出如果有任何方法,我可以调用signOut()函数时,注销按钮被点击,而不需要使按钮的一部分视图,而不是shell页面。
对于好奇的人来说,我通过默认设置display:none
来控制按钮是否可见,并将这一行放在我想要显示它的所有视图的顶部:
<script>
document.getElementById('logoutbutton').style.display = 'block';
</script>
这就是为什么我知道我可以通过DOM访问按钮,甚至在视图中。
这对我很有效。
<button id="btn">click</button>
$scope.show = function(){alert('msg');}
$('#btn').on('click',$scope.show);
我不得不同意Mostafa Talebi的观点,公认的答案是使用一个完全不同的框架,而不是基于AngularJS的答案。事实上,我能看到你的plunkr的唯一问题是,主div缺少ng-controller指令,这将需要指向你的签出控制器。然后,您就可以以常规方式将您的按钮上的ng-click连接到您的注销功能。这就是glendaviesnz的观点。这样你就不需要做javascript的get元素和事件监听,这不是Angular的方式。
除此之外,应该避免在angular应用中使用jquery事件,因为它们实际上发生在angular的视图之外,或者更准确地说,发生在angular的摘要周期之外。你可以用$on来列出Angular中的事件,用$broadcast/$emit来广播事件。
你的需求是一个带有身份验证的基本spa,这方面有很多很好的例子,Dan Wahlin的CustomerManager会让你想到如何用纯粹的Angular方式实现你想要的。