使用控制器内的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) { 
     // .... 
})