AngularJS - ng-click in shell page



我有一个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方式实现你想要的。

最新更新