首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS指令、ControllerAs、范围和vm属性

AngularJS指令、ControllerAs、范围和vm属性
EN

Stack Overflow用户
提问于 2015-07-11 13:33:03
回答 1查看 3.3K关注 0票数 1

使用角,我创建了这样一个指令:

代码语言:javascript
复制
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

代码语言:javascript
复制
MyDirectiveController.$inject = ['$scope'];

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

我的指示HTML模板如下:

代码语言:javascript
复制
<div>{{vm.scenarios[0].name}}</div>

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

代码语言:javascript
复制
<my-directive scenarios="vm.scenarios"></my-directive>

父控制器具有一个属性:

代码语言:javascript
复制
vm.scenarios = [] // could be [{ name : "test"}]

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

当将它添加到我的指令控制器中时,它可以工作,但是解决方案对我来说似乎是错误的:

代码语言:javascript
复制
$scope.$watch('scenarios', function(newValue) {
    if (newValue !== undefined) {
            vm.scenarios = $scope.scenarios;
    }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-11 13:53:22

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

代码语言:javascript
复制
MyDirectiveController.$inject = [];

function MyDirectiveController() {
    // nothing here
}

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

代码语言:javascript
复制
scope: {
    scenarios: '='
},

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31357698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档