最近在學習AngularJs的過程中,自己做了個demo,但程序運行后卻發現有個地方運行不對勁,糾結了半天,也問了,也查了,但是沒有一個滿意的答案,所以特地貼出來,請教各位大神(先說聲謝謝了!)。為了更直觀的說明問題,直接貼代碼:
1 <!doctype html> 2 <html ng-app="app"> 3 <head> 4 <title>使用$provide自定義服務</title> 5 <script src="http://cdn.bootcss.com/angular.js/1.5.0/angular.min.js"></script> 6 </head> 7 <body> 8 <div ng-controller="ctr1"> 9 <div class="show"> 10 服務返回的值:<br> 11 <span>姓名:{{info('name')}}</span><br> 12 <span>性別:{{info('sex')}}</span><br> 13 <span>年齡:{{info('score')}}</span><br> 14 <span>小明的信息:{{val}}</span> 15 </div> 16 </div> 17 <script type="text/javascript"> 18 var m1= angular.module('app', [], function ($provide) { 19 $provide.factory('$output', function () { 20 var stu = { 21 name: '張三', 22 sex: '男', 23 score: '60' 24 }; 25 return stu; 26 }); 27 $provide.value("myval","33333"); 28 $provide.service("myservice",function(){ 29 return { 30 name:"小明", 31 age:18 32 } 33 }) 34 }); 35 m1.controller('ctr1', function ($scope, $output,myval,myservice) { 36 $scope.info = function (n) { 37 for (var _n in $output) { 38 console.log(_n); // 打印key 39 if (_n == n) { 40 return ($output[_n]); 41 } 42 } 43 }; 44 $scope.val=myservice; 45 }); 46 </script> 47 </body> 48 </html>
在第11、12、13行調用了第36行的info()函數后,按照常規邏輯,console.log(_n);后,在控制台應該打印出
name
name
sex
name
sex
score
但是結果出乎我的意料,程序竟然執行了兩遍,我百思不解。

我考慮着是不是AngularJs的底層就是這樣運行的,我自己又試了一下,代碼如下:
1 m1.controller('ctr1', function ($scope, $output,myval,myservice) { 2 $scope.info = function (n) { 3 console.log(1); // 打印結果為6個1 4 for (_n in $output) { 5 console.log(_n); //打印key 6 console.log(1); // 打印結果為12個1 7 if (_n == n) { 8 return ($output[_n]); 9 } 10 } 11 }; 12 $scope.val=myservice; 13 });
對於這個問題,我網上查了很多資料也問了一些高手,也沒有明確的解決辦法,各路大神各顯神通吧,小生在這里要受教了,多謝!
