我在Page的两个不同部分使用一个控制器,因为我使用“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>
答案 0 :(得分:2)
组件指令的隔离范围不再泄漏到包含指令实例的模板中。这意味着您无法再从定义了隔离指令的元素上的属性访问隔离范围。
有关示例,请参阅https://github.com/angular/angular.js/issues/10236。
在单个元素上请求隔离范围和任何其他范围是一个错误。在此更改之前,如果编译器按照非隔离范围指令后跟隔离范围指令的顺序应用它们,则编译器允许两个指令请求子范围和隔离范围。
现在无论顺序如何,编译器都会出错。
答案 1 :(得分:0)
这与迁移问题有关。 旧的控制器样式语法不起作用。
来自https://docs.angularjs.org/guide/migration
由于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();
}]);
希望这对你有所帮助。
答案 2 :(得分:0)
在工作小提琴https://jsfiddle.net/janega/tnnh6u5w/1/
中尝试这样做var PersonCtrl = (function () {
function PersonCtrl($scope) {
this.$scope=$scope;
this.$scope.first = 'First';
this.$scope.last = 'Last';
}
return PersonCtrl;
})();
angular.module('myapp', []);
angular.module('myapp')
.controller('PersonCtrl',PersonCtrl);
PersonCtrl.$inject =['$scope', '$log'];
function PersonCtrl($scope,$log){
if (PersonCtrl.Instance === undefined) {
PersonCtrl.Instance = new PersonCtrl($scope, $log);
}
return PersonCtrl.Instance;
}
答案 3 :(得分:0)
只需删除第二个控制器&#34; as&#34;并使<div ng-controller="PersonCtrl">
作为父控制器并在另一个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>