Javascript 无法从$scope获取值
包含应用程序模块Javascript 无法从$scope获取值,javascript,angularjs,Javascript,Angularjs,包含应用程序模块 app.js var appProfileDetails = angular.module('profileDetailsApp', [ 'ngMaterial','ngAria','ngAnimate','ngRoute']); appProfileDetails.controller('contactController', function($scope) { $scope.msg=
var appProfileDetails = angular.module('profileDetailsApp', [
'ngMaterial','ngAria','ngAnimate','ngRoute']);
appProfileDetails.controller('contactController', function($scope) {
$scope.msg= function() {
alert($scope.emailId);
};
});
var appProfileDetails = angular.module('profileDetailsApp', [
'ngMaterial','ngAria','ngAnimate','ngRoute']);
appProfileDetails.controller('contactController', function($scope) {
$scope.msg= function() {
alert($scope.emailId);
};
});
<div>
<input type="email" ng-model="emailId"/>
<input type="button" ng-click="msg()"/>
</div>
它不起作用的原因是ng include创建了一个新的子作用域,从而打破了原型作用域继承 必须阅读才能更好地理解此问题:
作为一个好的经验法则,一定要使用语法这就是为什么要使用它。尝试使用controllerAs语法
ng controller=“contactController as contact”
然后在ContactDetails2模板中执行ng model=“contact.emailId”
(并将ng单击
值更改为contact.msg()
)
如果您在contactController中将emailId实例化为“”,它也会起作用。$scope.emailId='
让我简单地解释一下这里发生了什么
angular的作用域问题在于它使用原型继承。angular将从上到下创建作用域
因此,它将首先创建您的控制器并为其创建一个新的作用域,然后遇到ng include,这不幸地创建了一个新的继承作用域
这意味着它是一个新的范围对象,但原型(又名父对象)被设置为父范围。每当angular在该新范围中查找ng include的内容时,它都会检查它是否存在于我的本地范围中,如果不存在,它是否存在于父范围中,依此类推,直到它到达$rootScope
问题是ng模型检查本地作用域上是否存在emailId。它在本地作用域上找不到它。它查找父作用域,但在那里也找不到它。因此它将在本地创建它。这就是父作用域没有emailId的原因
因此,要么保证它已经出现在控制器上(因为ng模型将立即处理正确的变量),要么使用控制器解决问题。使用controllerAs语法是绝对推荐的,因为它避免了所有类似的问题,而无需考虑它
为什么Controllera可以工作?因为当它为控制器创建作用域时,它会在一个新的作用域上创建一个属性。在我的建议中,它会创建“联系人”。现在,当ng模型在ng include中运行时,它会检查“我有联系人吗?”没有。但是我的父母有。父母的联系人有电子邮件ID吗?没有,好的。让我在那里创建它并在我的父母范围内操作它
如果你想避免angular 1出现问题,一定要了解作用域是如何工作的。我建议你遵循类似的样式指南。这也解释了为什么你应该遵循这些规则。我无法在警报框中获取电子邮件的值。有人可以帮我吗?你希望代码做什么?它实际上在做什么?是否有e错误消息?如果需要帮助,您需要发布所有这些信息。在contact.jsp中,我包含了Contactdetails2.html,在那里我使用了电子邮件和一个按钮输入类型。单击按钮后,我希望在警报框中看到电子邮件。