AngularJS指令,ControllerAs,范围和vm属性

时间:2015-07-11 13:33:04

标签: angularjs angularjs-directive

使用Angular我创建了一个这样的指令:

angular
    .module('my-module', [])
    .directive('myDirective', function () {

        return {
            restrict: 'E',
            templateUrl: currentScriptPath.replace('.js', '.html'),
            scope: {
                scenarios: '='
            },
            controller: MyDirectiveController,
            controllerAs: 'vm',
            bindToController: true,
            replace: true
        }

    });

MyDirectiveController

MyDirectiveController.$inject = ['$scope'];

function MyDirectiveController($scope) {
    var vm = this;
    vm.scenarios = $scope.scenarios;
}

我的指令HTML模板是这样的:

<div>{{vm.scenarios[0].name}}</div>

在我的父视图HTML中,我以这种方式使用指令:

<my-directive scenarios="vm.scenarios"></my-directive>

父控制器有一个属性:

vm.scenarios = [] // could be [{ name : "test"}]

当$ http调用后父控制器的vm.scenarios被设置时,当指令控制器的vm.scenarios绑定到$scope.scenarios并且它不绑定时,它不可用父母控制器vm.scenarios最终填充时会更新。

将此添加到我的指令控制器时,它可以正常工作,但解决方案对我来说似乎不对:

$scope.$watch('scenarios', function(newValue) {
    if (newValue !== undefined) {
            vm.scenarios = $scope.scenarios;
    }
});

1 个答案:

答案 0 :(得分:1)

这是你应该如何定义指令控制器:

MyDirectiveController.$inject = [];

function MyDirectiveController() {
    // nothing here
}

您不需要使用$scope,因为您已经绑定到控制器实例this。这意味着范围配置

scope: {
    scenarios: '='
},

填充控制器实例this对象,而不是$scope对象,因此$scope.scenariosundefined。使用控制器中的vm.scenarios = $scope.scenarios;,您只需使用未定义的值覆盖正确的绑定。

演示: http://plnkr.co/edit/lYg15Xpb3CsbQGIb37ya?p=preview