AngularJS中Onsen UI按钮的ng-click事件无法触发求助
解决Onsen UI按钮ng-click事件无法触发的问题
嘿,我仔细看了你的代码,问题确实出在作用域关联上!Onsen UI加载模板页面时会创建独立的作用域,你的ListenButtonController虽然注册了,但因为模板页面的作用域和外层上下文没有正确绑定,导致按钮找不到onListenButtonClick方法。这里给你两个实用的解决方案:
方案一:合并控制器(适合当前简单场景)
既然你现在只有一个标签页,完全可以把按钮的点击逻辑直接放到外层的TabbarController里,这样模板页面的作用域会自动继承外层控制器的方法,不用额外处理作用域问题:
修改后的JavaScript代码:
var module = angular.module("my-app", ["onsen"]); module.controller("TabbarController", function($scope) { $scope.updateTitle = function($event) { $scope.title = angular.element($event.tabItem).attr("label"); }; // 把按钮点击方法移到这里 $scope.onListenButtonClick = function() { alert("lool"); }; }); // 可以删掉原来的ListenButtonController了
对应的模板代码调整:
<template id="homeTemplate"> <ons-page id="Tab1"> <p style="text-align: center;"> Welcome Home ^_^ </p> <ons-button modifier="large" ng-click="onListenButtonClick()" >Click to Listen (not implemented yet), it just shows an alert!!</ons-button> </ons-page> </template>
方案二:使用controllerAs语法(适合未来复杂功能)
如果之后你要拆分多个控制器、实现更复杂的功能,推荐用controllerAs语法,它能彻底避免AngularJS作用域继承带来的困惑,让代码结构更清晰:
修改后的JavaScript代码:
var module = angular.module("my-app", ["onsen"]); module.controller("TabbarController", function() { var vm = this; vm.updateTitle = function($event) { vm.title = angular.element($event.tabItem).attr("label"); }; }); module.controller("ListenButtonController", function() { var vm = this; vm.onListenButtonClick = function() { alert("lool"); }; });
对应的HTML代码调整:
<ons-page ng-controller="TabbarController as tabCtrl"> <ons-toolbar> <div class="center">{{ tabCtrl.title }}</div> </ons-toolbar> <ons-tabbar swipeable position="auto" ons-prechange="tabCtrl.updateTitle($event)"> <ons-tab page="homeTemplate" label="Home" icon="ion-home, material:md-home" active > </ons-tab> </ons-tabbar> </ons-page> <template id="homeTemplate"> <ons-page id="Tab1" ng-controller="ListenButtonController as btnCtrl"> <p style="text-align: center;"> Welcome Home ^_^ </p> <ons-button modifier="large" ng-click="btnCtrl.onListenButtonClick()" >Click to Listen (not implemented yet), it just shows an alert!!</ons-button> </ons-page> </template>
为什么原来的代码不行?
Onsen UI的<ons-tab>加载模板页面时,内部的<ons-page>会生成一个独立的子作用域。你原来的写法虽然给<ons-page>绑定了控制器,但AngularJS的作用域继承特性加上Onsen的组件隔离机制,导致按钮所在的作用域没有正确关联到ListenButtonController的方法,最终触发失败。上面的两种方案都能解决这个绑定问题,选哪个取决于你后续的功能规划~
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

