如何正确使用隔离作用域属性?
How to use an isolated scope property properly?
如何正确使用隔离作用域属性?
我有一个指令,它是从页面控制器调用的,带有传递给它的属性 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'
};
}]);
您可以在您的指令中使用 $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'
};
}]);
您正在使用 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
};
}]);
您可以创建 getter 函数来按需检索它,而不是在指令加载时初始化 extendedInfo
。
this.getExtendedInfo = function(){
return ExtendedItemFactory.get({ id: $scope.item.id });
}
或者,您可以在 item
准备就绪之前阻止您的指令加载
<div ng-if="ctrl.item">
<my-directive item="ctrl.item"></my-directive>
</div>
如何正确使用隔离作用域属性?
我有一个指令,它是从页面控制器调用的,带有传递给它的属性 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'
};
}]);
您可以在您的指令中使用 $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'
};
}]);
您正在使用 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
};
}]);
您可以创建 getter 函数来按需检索它,而不是在指令加载时初始化 extendedInfo
。
this.getExtendedInfo = function(){
return ExtendedItemFactory.get({ id: $scope.item.id });
}
或者,您可以在 item
准备就绪之前阻止您的指令加载
<div ng-if="ctrl.item">
<my-directive item="ctrl.item"></my-directive>
</div>