Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法从$scope获取值_Javascript_Angularjs - Fatal编程技术网

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=

包含应用程序模块

  • app.js

    var appProfileDetails = angular.module('profileDetailsApp', [
                                           'ngMaterial','ngAria','ngAnimate','ngRoute']);
    
    appProfileDetails.controller('contactController', function($scope) {
        $scope.msg= function() {
            alert($scope.emailId);
        };
    });
    
  • 它具有控制器文件

  • contactController.js

    var appProfileDetails = angular.module('profileDetailsApp', [
                                           'ngMaterial','ngAria','ngAnimate','ngRoute']);
    
    appProfileDetails.controller('contactController', function($scope) {
        $scope.msg= function() {
            alert($scope.emailId);
        };
    });
    
  • Html片段(Contact.jsp

    
    
  • 该文件包含在上述文件中

  • ContactDetails2.html

    <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,在那里我使用了电子邮件和一个按钮输入类型。单击按钮后,我希望在警报框中看到电子邮件。