2

如何正确使用隔离范围属性?

我有一个指令,它是从页面控制器调用的,并带有一个item传递给它的属性,例如<my-directive item="myItem"></my-directive>,包含一个id.

下面的代码将不起作用,因为它似乎$scope.item在控制器中未定义..就像我使用它太快了一样。当我想使用它时,如何确定它实际上已设置?

app.directive('myDirective', [function() {
return {
    restrict: 'E',
    templateUrl: 'template.html',
    scope: {
        item: "="
    },
    controller: ['$scope', 'ExtendedItemFactory', function($scope, ExtendedItemFactory) {
        this.extendedInfo = ExtendedItemFactory.get({ id: $scope.item.id });
    }],
    controllerAs: 'MyDirectiveCtrl'
};
}]);
4

3 回答 3

1

你可以$watch在你的指令中使用它来观察值的变化并触发你想要的代码。

代码

app.directive('myDirective', [function() {
    return {
        restrict: 'E',
        templateUrl: 'template.html',
        scope: {
            item: "="
        },
        controller: ['$scope', 'ExtendedItemFactory', function($scope, ExtendedItemFactory) {
            this.extendedInfo = ExtendedItemFactory.get({
                id: $scope.item.id
            });
            $scope.$watch('item', function(newVal, oldVal) {
                if (newVal && newVal != oldVal)
                    this.extendedInfo = ExtendedItemFactory.get({
                        id: $scope.item.id
                    });
            }, true).bind(this);
        }],
        controllerAs: 'MyDirectiveCtrl'
    };
}]);
于 2015-06-09T13:47:50.260 回答
0

您正在使用 controllerAs,因此您不需要在此实例中注入 $scope。

我会将您的指令定义更改为以下内容,注意使用 bindToController,这将确保您的隔离范围值已填充并在您的控制器上可用:

app.directive('myDirective', [function() {
    return {
        restrict: 'E',
        templateUrl: 'template.html',
        scope: {
            item: "="
        },
        controller: ['ExtendedItemFactory', function(ExtendedItemFactory) {
            this.extendedInfo = ExtendedItemFactory.get({ id: this.item.id });
        }],
        controllerAs: 'MyDirectiveCtrl',
        bindToController: true
    };
}]);
于 2015-06-09T13:49:37.293 回答
0

extendedInfo您可以创建按需检索它的 getter 函数,而不是在指令加载时进行初始化。

this.getExtendedInfo = function(){
    return ExtendedItemFactory.get({ id: $scope.item.id });
}

item或者,您在准备好之前阻止您的指令加载

<div ng-if="ctrl.item">
    <my-directive item="ctrl.item"></my-directive>
</div>
于 2015-06-09T13:53:50.027 回答