angularjs 1.3控制器不工作

angularjs 1.3控制器不工作,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我在页面的两个不同部分使用一个控制器,因为我使用的是控制器别名,使用的是“controller as”语法。但升级到Angular 1.3.15后,它就不再工作了。下面是模拟情况的小提琴 如果我有任何错误,请告诉我 <div ng-app="myapp"> <div ng-controller="PersonCtrl"> <input type="text" ng-model="first"> <p>{{first}}</

我在页面的两个不同部分使用一个控制器,因为我使用的是控制器别名,使用的是“controller as”语法。但升级到Angular 1.3.15后,它就不再工作了。下面是模拟情况的小提琴

  • 如果我有任何错误,请告诉我

    <div ng-app="myapp">
    <div ng-controller="PersonCtrl">
        <input type="text" ng-model="first">
        <p>{{first}}</p>
    </div>
    <div ng-controller="PersonCtrl as person">
        <p>{{person.$scope.first}}</p>
    </div>
    
    
    {{first}}

    {{person.$scope.first}

    来自:

    组件指令的隔离范围不再泄漏到包含该指令实例的模板中。这意味着您不能再从定义隔离指令的元素上的属性访问隔离范围

    有关示例,请参见

    在单个元素上请求隔离作用域和任何其他作用域是错误的。在此更改之前,如果编译器按照非隔离作用域指令后跟隔离作用域指令的顺序应用子作用域和隔离作用域,则编译器允许两个指令请求子作用域和隔离作用域


    现在,不管顺序如何,编译器都会出错。

    这与迁移问题有关。 旧的控制器样式语法不起作用

    由于
    3f2232b5
    $controller
    将不再在窗口中查找控制器。在窗口中查找控制器的旧行为最初用于示例、演示和玩具应用程序。我们发现允许全局控制器功能会鼓励不良做法,因此我们决定在默认情况下禁用此行为

    要迁移,请向模块注册控制器,而不是将其公开为全局模块:

    之前:

    function MyController() {
      // ...
    }
    
    之后:

    angular.module('myApp', []).controller('MyController', [function() {
      // ...
    }]);
    
    尽管不建议您这样做,但您可以像这样重新启用旧行为:

    angular.module('myModule').config(['$controllerProvider', function($controllerProvider) {
      // this option might be handy for migrating old apps, but please don't use it
      // in new ones!
      $controllerProvider.allowGlobals();
    }]);
    

    希望这对你有所帮助。

    试着在工作中使用小提琴


    只需删除带有“as”的第二个控制器,并将
    设为父控制器,然后在另一个div中再次写入表达式,以使相同的控制器ng模型生效

    <div ng-app="myapp">
    <div ng-controller="PersonCtrl">
        <input type="text" ng-model="first">
        <p>{{first}}</p>
       <div>
        <p>{{first}}</p>
       </div>
    </div>
    
    
    {{first}}

    {{first}}


    请检查:为什么要使用那种类型的。。。构造。。用于声明控制器?用实例和东西?为什么要从控制器返回函数?从未见过这样做我使用的是typescript,它实际上生成了这种代码模式。他没有在窗口上使用控制器,他像myapp.controller('PersonCtrl',['$scope','$log',function($scope,$log)一样注册了它@Rushi,我认为当我们在全局范围内定义一些东西时,它是“窗口”对象的一部分。这是1.3的更新版本。您可以在控制台中进行检查。“PersonCtrl”在全局范围内定义。他在全局范围内定义了控制器功能,但他正在通过myapp.controller(“PersonCtrl”)将其注册到angular app,['$scope','$log',function($scope,$log),因此它将不在全局窗口范围内。这似乎是迄今为止最好的解决方案,正如kurenai Kunai所建议的“组件指令的隔离范围不再泄漏到包含该指令实例的模板中。”另外,若应用于同一个元素,那个么需要隔离作用域的控制器和其他指令将不起作用。
    <div ng-app="myapp">
    <div ng-controller="PersonCtrl">
        <input type="text" ng-model="first">
        <p>{{first}}</p>
       <div>
        <p>{{first}}</p>
       </div>
    </div>