先上代码:
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script> </head> <body style="background-repeat:no-repeat; background-image:url(images/draw.jpg);background-size:100% 100%;"> <input type=button onclick="document.getElementById('aaa').value +='1a';" value="设置内容"> <input type=button onclick="document.getElementById('aaa').onclick()" value=触发事件 > <div ng-app="luckyDrawApp" ng-controller="luckyDrawController"> <input type="text" id=aaa ng-change="drawInfoChanged(2)" style1="display:none;" oninput="this.onchange()" ng-model="initDrawInfo" /> <div id="main"> </div> </div> <script type="text/javascript"> var app = angular.module('luckyDrawApp', []); app.controller('luckyDrawController', function ($scope) { $scope.initDrawInfo="aaa"; $scope.drawInfoChanged = function () { alert(2); } $scope.aaa=function() { } }); </script> </body> </html>
我想做的是:通过外部行为修改angular的数据。
初步想法是:
1、通过点击”设置内容“按钮修改 id 为 aaa 的对象的 value 属性(该目的达成)
2、希望 aaa 的value的改变,触发事件change,执行angular的行为(未达成)
3、鉴于2未能达成,定义了按钮 ”触发事件“来执行 aaa 的onchange,但报告没有这个方法。
你这代码问题有点多哈,首先,document.getElementById('aaa').onclick()这个是不对的哈,应该用click();
另外oninput是用户输入(粘贴)等导致内容变化后触发的,直接用js修改value不会触发。
this.onchange()是什么玩意?
一般来说,你在外部修改了值,可以手动调用$scope.$apply()来进行同步。
onclick、click问题都一样。
oninput是说等价于onpropertychange,但只针对于value属性,然onpropertychange没响应。
this.onchange()是触发onchange事件,在oninput里执行后,是会正确触发的。
外部修改值?怎么修改是问题啊。比如,我通过winform宿主webbrowser来修改指定input[type=text]的value,但是,在哪里去触发使用apply呢?
(这个才是我的真正需求,winform运行动态给webbrowser提供数据,如果不走angular是可以纯粹通过js来实现,现在想走angular)
@519740105: 那你完全可以直接用angular的方式设置值,angular.element('#aaa').scope.initDrawInfo = 'xxx'这样来修改呢。
@幻天芒: 试下!
@519740105: 我能说写错了一点么:angular.element('#aaa').scope().initDrawInfo = 'xxx'
@幻天芒: alert(angular.element('#aaa'))没反应。
@幻天芒: 报告错误:
Error: [jqLite:nosel] http://errors.angularjs.org/1.4.6/jqLite/nosel
@519740105: 好嘛,你居然要照抄:
<input type=button onclick="fun1();" value="设置内容"> <input type=button onclick="document.getElementById('aaa').onclick()" value=触发事件 > <div ng-app="luckyDrawApp" ng-controller="luckyDrawController"> <input type="text" id=aaa ng-change="drawInfoChanged(2)" style1="display:none;" oninput="this.onchange()" ng-model="initDrawInfo" /> <div id="main"> </div> </div> <script type="text/javascript"> function fun1(){ var el = document.getElementById('aaa'); var scope = angular.element(el).scope(); scope.initDrawInfo = scope.initDrawInfo + 'aaaa'; scope.$apply(); } var app = angular.module('luckyDrawApp', []); app.controller('luckyDrawController', function ($scope) { $scope.initDrawInfo="aaa"; $scope.drawInfoChanged = function () { alert(2); } $scope.aaa=function() { } }); </script>
@幻天芒: 日太阳
@519740105: 上~
建议题主先去看一下关于Angularjs的文档。
了解一下Ng的语法及数据绑定方式。
毛,小白啊,只是临时弄弄,又不想专职angular
@519740105:
使用 ngKeydown或ngKeypress或ngKeyup 或使用$watch
@Xiaoxiong: watch应该是我要的,先关注下。