2013-07-10 108 views
2

我查看了其他“函数未定义”的问题,但似乎找不到适用于我的用例的问题。我正在使用angular.js。在angularjs控制器中定义的函数没有定义函数的错误

我有一个最初空的div,#mylist,我在js中动态填充。我在控制器中定义了一个函数,我将其分配给一个复选框的onChange事件。

以下是完整的DOC:

<!doctype html> 
<html data-ng-app="testapp"> 
<head> 
    <script src="jquery-1.10.2.min.js"></script> 
    <script src="angular.min.js"></script> 
    <script> 
     var app = angular.module("testapp", []);   
     app.controller("MyAppController", function ($scope) { 
      createCheckbox(); 

      function doSomething() { 
       alert("hello!"); 
      } 

      function createCheckbox() { 
       $("#mylist").html("<input type='checkbox' onChange='javascript:doSomething();' />"); 
      }  
     }); 
    </script> 
</head> 

<body data-ng-controller="MyAppController"> 
    <div id="mylist"></div> 
</body> 
</html> 

运行时,点击的功能没有定义错误的复选框结果。

我在这里错过了什么?谢谢。

+0

我认为“你做错了”的一些解释是关于角色讨论(通常是正确的)所说的最常见的事情。所以基本上你不应该使用jQuery来获取DOM中的元素......一秒钟我认为我可以很容易地回答。 – shaunhusain

+0

目前,我正在使用角度来进行路由。很明显,我不是高级js开发人员,我无法分辨这个错误是使用angular还是jq还是plain js。我认为在这一点上寻求帮助可以带领我走向一个方向是合理的。 – Steven

+0

@Steven我不是故意粗鲁/粗鲁,只是说我最近听到过很多这种性质的说法,还有那个让角色听起来像是邪教的角色。我也不是JS专家,但是从AS3/Flex跳到AngularJS。对我来说,jQuery总是显得有些混乱(不是Angular是棒棒糖,但感觉更有组织,并且更不容易出错)。无论如何,希望我的回答有道理,基本上我使用绑定来触发一个正在监视该变量的函数,所以当它发生变化时,我正在触发一个函数。 – shaunhusain

回答

0
<!doctype html> 
<html data-ng-app="testapp"> 
<head> 
    <script src="jquery-1.10.2.min.js"></script> 
    <script src="angular.min.js"></script> 
    <script> 

var app = angular.module("testapp", []); 

app.controller("MyAppController", function ($scope) { 
    $scope.someProperty = true; 


    $scope.$watch("someProperty", function (someProperty){ 
     alert("hello!"+someProperty) 
    }); 
}); 

    </script> 
</head> 
<body data-ng-controller="MyAppController"> 
    <div id="mylist"><input type="checkbox" ng-model="someProperty"/></div> 
</body> 

</body> 
</html> 

http://jsfiddle.net/y6XhY/

+0

感谢您组装一个工作样本。我会看看这个。 – Steven

+0

哦,在这种情况下(使用复选框),您可以使用ng-click从HTML中调用函数中的函数,例如ng-click =“doSomething()”(或复选框I believe ng-change =“ doSomething()“)我刚开始时看到一个属性版本正在考虑输入类型”文本“。 – shaunhusain

0

如果使用AngularJs,这是很好的做法定义的函数里面你控制器范围内。$范围的领域可以成为你的功能,而不是的onChange可以使用ngChange指令(只你必须在该输入上设置ngModel)。

$scope.doSomething = function() { 
    alert("hello!"); 
}