使用控制器内的ControllerAs访问AngularJS指令中的vm属性
在另一个问题上,我得到了答案。 (演示:) 来源如下:使用控制器内的ControllerAs访问AngularJS指令中的vm属性,angularjs,angularjs-directive,Angularjs,Angularjs Directive,在另一个问题上,我得到了答案。 (演示:) 来源如下: var app = angular.module('plunker', []); app.controller('MainCtrl', function($scope, $timeout) { this.scenarios = [] $timeout(function() { this.scenarios.push({name: 21}); }.bind(this), 1000); });
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $timeout) {
this.scenarios = []
$timeout(function() {
this.scenarios.push({name: 21});
}.bind(this), 1000);
});
MyDirectiveController.$inject = [];
function MyDirectiveController() {
var vm = this;
// code of this question...
}
app.directive('myDirective', function() {
return {
restrict: 'E',
template: '<div>{{vm.scenarios[0].name}}</div>',
scope: {
scenarios: '='
},
controller: MyDirectiveController,
controllerAs: 'vm',
bindToController: true,
replace: true
}
});
当我记录此日志时:
var vm = this;
console.log(vm);
它返回对象{scenarios:Array[0]}
,但当我在浏览器中检查它时,scenarios
包含预期的值,因为它在超时1秒后已更新
但是当它们绑定到场景
属性时,我需要在控制器内部映射场景
:
vm.myscenarios = vm.scenarios.map(function(scenario) {
// ....
})
我该怎么做?我是否应该观看
vm.scenarios
以了解变化?这完全是错误的。您有一个数组,并且您正在编写一个指令以仅显示数组的第一个元素?为什么不改为使用ng repeat=“scenario in scenarios”
,让angular处理所有其他事情呢?{{vm.scenarios[0].name}
只是为了说明绑定是有效的。场景
是使用$http
填充的,$timeout
只是为了显示延迟。好吧,那么,指令将显示所有场景?然后,您希望与其中一个进行交互,并使其返回页面的控制器,而不是指令的控制器?很难确定您遇到了什么问题,或者.map
与指令有什么关系。MainCtrl
通过$http
获取场景
,并使用
将它们绑定到我的指令。但在我的指令显示它们之前,需要修改它们(所需的模式与$http
接收的模式不同)。但是我的指令不能使用$http
,因为当vm.myscenarios
发生更改时,vm.scenarios
(因此MainCtrl
的scenarios
也必须使用此更改进行更新。作为一个非主题,这就是为什么我建议您不要对所有内容都使用vm.
。只要有可能,您应该使用一些可以帮助您辨别哪个控制器是哪个控制器的东西<代码>控制器:当您访问main
范围与myDirective
范围时,“myDirective”和MainCtrl作为main
将更容易识别。这是各种错误。您有一个数组,并且您正在编写一个指令以仅显示数组的第一个元素?为什么不改为使用ng repeat=“scenario in scenarios”
,让angular处理所有其他事情呢?{{vm.scenarios[0].name}
只是为了说明绑定是有效的。场景
是使用$http
填充的,$timeout
只是为了显示延迟。好吧,那么,指令将显示所有场景?然后,您希望与其中一个进行交互,并使其返回页面的控制器,而不是指令的控制器?很难确定您遇到了什么问题,或者.map
与指令有什么关系。MainCtrl
通过$http
获取场景
,并使用
将它们绑定到我的指令。但在我的指令显示它们之前,需要修改它们(所需的模式与$http
接收的模式不同)。但是我的指令不能使用$http
,因为当vm.myscenarios
发生更改时,vm.scenarios
(因此MainCtrl
的scenarios
也必须使用此更改进行更新。作为一个非主题,这就是为什么我建议您不要对所有内容都使用vm.
。只要有可能,您应该使用一些可以帮助您辨别哪个控制器是哪个控制器的东西<代码>控制器:当您访问main
作用域与myDirective
作用域时,“myDirective”和MainCtrl作为main
将更容易识别。
var vm = this;
console.log(vm);
vm.myscenarios = vm.scenarios.map(function(scenario) {
// ....
})