您可以在共享相同视图的单独控制器中使用 ControllerAs 语法吗?
Can you use ControllerAs syntax within separate Controllers that share the same view?
问题:
能否在共享相同视图的单独控制器中使用 ControllerAs 语法?
即:(var vm = this)?
困境
我正在尝试消除 EsLinter 在我的控制台中生成的 linter 错误:
"Designated alias 'vm' is not assigned to 'this' consistent-this"
我想知道如何在控制器中使用:var vm = this 或将 Controller 设置为 vm(我两种都试过了,但都不行)
唯一有效的是控制器内的 $scope(如下所示)...每当我尝试应用 controller作为 controller.js 或 html div 中的语法 并将相关变量 (vm) 应用于 modal.html 中的内插表达式数据未呈现。
最佳做法是什么?
** 旁注:
我在将 ng-click 动作函数 绑定到基于控制器的视图时也遇到了问题...下面的示例不起作用(对于动作)——如果我更改{{::action}} 到 {{::action()}} 函数在加载时触发而不是在点击时触发:
示例modal.html:
<article>
<h1>{{::title}}</h1>
<p>{{::body}}</p>
<button ng-click="{{::action}}">{{::button}}</button>
</article>
HTML拉进上面^
<div class="hide"
ng-controller="ConfirmModalController"
ng-include src="'/app/widgets/modals/modal.html'"></div>
<div class="hide"
ng-controller="ErrorModalController"
ng-include src="'/app/widgets/modals/modal.html'"></div>
示例控制器
错误控制器
angular
.module('common.modal')
.controller('ErrorModalController', ErrorModalController);
function ErrorModalController(modalService, $scope) {
var vm = $scope;
vm.title = 'There was an error with your request';
vm.body = 'Please contact adminstrator regarding this error';
vm.button = 'Dismiss';
vm.action = function () {
console.log("closing modals");
modalService.closeAllModals();
};
}
确认控制器
angular
.module('common.modal')
.controller('ConfirmModalController', ConfirmModalController);
function ConfirmModalController(modalService, $scope) {
var vm = $scope;
vm.title = 'Confirm Your Subscription';
vm.body = '.99 per month will be billed to your account.';
vm.button = 'Subscribe';
vm.action = function () {
console.log("confirming subscription");
modalService.confirmSubscription();
};
}
数据未呈现,因为您没有在引用中包含控制器。我看不到您在模板中加载控制器的位置,但是如果您使用 controllerAs 语法引用控制器,那么要引用它的属性,您必须使用该引用。 IOW,如果您将控制器加载为 foo,那么您的模板应该如下所示:
<article>
<h1>{{::foo.title}}</h1>
<p>{{::foo.body}}</p>
<button ng-click="{{::foo.action()}}">{{::foo.button}}</button>
</article>
在您发布的代码中,您没有使用 controllerAs 语法。您需要使用 ng-controller="ConfirmModalController as vm"
加载它。在 JavaScript 和模板中引用它的方式之间没有直接关联。您甚至不必称它们为同一事物。
感谢@estus 为每种类型的模态创建一个指令的建议 - 现在可以使用 vm=this 正确呈现数据 ...
感谢@JC-Ford 告诉我如何将 {{::action}} 修复为 vm.action() 且不带括号 ...
** 旁注:(但是操作按钮仍然存在问题)
解决方案main.html
<confirm-modal></confirm-modal>
解决方案modal.html:
<article>
<h1>{{::vm.title}}</h1>
<p>{{::vm.body}}</p>
<button ng-click="vm.action()">{{::vm.button}}</button>
</article>
解决方案确认-modal.directive.js(和控制器)
angular
.module('common.modal')
.controller('ConfirmModalController', ConfirmModalController)
.directive('confirmModal', confirmModal);
/* @ngInject */
function confirmModal() {
var directive = {
templateUrl: 'app/widgets/modals/modal.html',
restrict: 'E',
controller: ConfirmModalController,
controllerAs: 'vm',
bindToController: true
};
return directive;
}
function ConfirmModalController(modalService) {
var vm = this;
vm.title = 'Confirm Your Subscription';
vm.body = '.99 per month will be billed to your account.';
vm.button = 'Subscribe';
vm.action = function () {
modalService.confirmSubscription();
};
}
解决方法错误-modal.directive.js(和控制器)
angular
.module('common.modal')
.controller('ErrorModalController', ErrorModalController)
.directive('errorModal', errorModal);
/* @ngInject */
function errorModal() {
var directive = {
templateUrl: 'app/widgets/modals/modal.html',
restrict: 'E',
controller: ErrorModalController,
controllerAs: 'vm',
bindToController: true
};
return directive;
}
function ErrorModalController(modalService) {
var vm = this;
vm.title = 'There was an error with your request';
vm.body = 'Please contact administrator regarding this error';
vm.button = 'Dismiss';
vm.action = function () {
modalService.closeAllModals();
};
}
问题:
能否在共享相同视图的单独控制器中使用 ControllerAs 语法?
即:(var vm = this)?
困境
我正在尝试消除 EsLinter 在我的控制台中生成的 linter 错误:
"Designated alias 'vm' is not assigned to 'this' consistent-this"
我想知道如何在控制器中使用:var vm = this 或将 Controller 设置为 vm(我两种都试过了,但都不行)
唯一有效的是控制器内的 $scope(如下所示)...每当我尝试应用 controller作为 controller.js 或 html div 中的语法 并将相关变量 (vm) 应用于 modal.html 中的内插表达式数据未呈现。
最佳做法是什么?
** 旁注: 我在将 ng-click 动作函数 绑定到基于控制器的视图时也遇到了问题...下面的示例不起作用(对于动作)——如果我更改{{::action}} 到 {{::action()}} 函数在加载时触发而不是在点击时触发:
示例modal.html:
<article>
<h1>{{::title}}</h1>
<p>{{::body}}</p>
<button ng-click="{{::action}}">{{::button}}</button>
</article>
HTML拉进上面^
<div class="hide"
ng-controller="ConfirmModalController"
ng-include src="'/app/widgets/modals/modal.html'"></div>
<div class="hide"
ng-controller="ErrorModalController"
ng-include src="'/app/widgets/modals/modal.html'"></div>
示例控制器
错误控制器
angular
.module('common.modal')
.controller('ErrorModalController', ErrorModalController);
function ErrorModalController(modalService, $scope) {
var vm = $scope;
vm.title = 'There was an error with your request';
vm.body = 'Please contact adminstrator regarding this error';
vm.button = 'Dismiss';
vm.action = function () {
console.log("closing modals");
modalService.closeAllModals();
};
}
确认控制器
angular
.module('common.modal')
.controller('ConfirmModalController', ConfirmModalController);
function ConfirmModalController(modalService, $scope) {
var vm = $scope;
vm.title = 'Confirm Your Subscription';
vm.body = '.99 per month will be billed to your account.';
vm.button = 'Subscribe';
vm.action = function () {
console.log("confirming subscription");
modalService.confirmSubscription();
};
}
数据未呈现,因为您没有在引用中包含控制器。我看不到您在模板中加载控制器的位置,但是如果您使用 controllerAs 语法引用控制器,那么要引用它的属性,您必须使用该引用。 IOW,如果您将控制器加载为 foo,那么您的模板应该如下所示:
<article>
<h1>{{::foo.title}}</h1>
<p>{{::foo.body}}</p>
<button ng-click="{{::foo.action()}}">{{::foo.button}}</button>
</article>
在您发布的代码中,您没有使用 controllerAs 语法。您需要使用 ng-controller="ConfirmModalController as vm"
加载它。在 JavaScript 和模板中引用它的方式之间没有直接关联。您甚至不必称它们为同一事物。
感谢@estus 为每种类型的模态创建一个指令的建议 - 现在可以使用 vm=this 正确呈现数据 ...
感谢@JC-Ford 告诉我如何将 {{::action}} 修复为 vm.action() 且不带括号 ...
** 旁注:(但是操作按钮仍然存在问题)
解决方案main.html
<confirm-modal></confirm-modal>
解决方案modal.html:
<article>
<h1>{{::vm.title}}</h1>
<p>{{::vm.body}}</p>
<button ng-click="vm.action()">{{::vm.button}}</button>
</article>
解决方案确认-modal.directive.js(和控制器)
angular
.module('common.modal')
.controller('ConfirmModalController', ConfirmModalController)
.directive('confirmModal', confirmModal);
/* @ngInject */
function confirmModal() {
var directive = {
templateUrl: 'app/widgets/modals/modal.html',
restrict: 'E',
controller: ConfirmModalController,
controllerAs: 'vm',
bindToController: true
};
return directive;
}
function ConfirmModalController(modalService) {
var vm = this;
vm.title = 'Confirm Your Subscription';
vm.body = '.99 per month will be billed to your account.';
vm.button = 'Subscribe';
vm.action = function () {
modalService.confirmSubscription();
};
}
解决方法错误-modal.directive.js(和控制器)
angular
.module('common.modal')
.controller('ErrorModalController', ErrorModalController)
.directive('errorModal', errorModal);
/* @ngInject */
function errorModal() {
var directive = {
templateUrl: 'app/widgets/modals/modal.html',
restrict: 'E',
controller: ErrorModalController,
controllerAs: 'vm',
bindToController: true
};
return directive;
}
function ErrorModalController(modalService) {
var vm = this;
vm.title = 'There was an error with your request';
vm.body = 'Please contact administrator regarding this error';
vm.button = 'Dismiss';
vm.action = function () {
modalService.closeAllModals();
};
}