gpt4 book ai didi

javascript - Angular Controller 继承范围问题

转载 作者:行者123 更新时间:2023-11-27 22:44:40 25 4
gpt4 key购买 nike

这里的目标是让两个不同的指令在技术上是兄弟共享功能。我要么使用一个,要么使用另一个,而决不会在另一个内部使用一个。

但是,第二个指令将具有第一个指令的所有功能,并添加一些小的功能。因此,我希望功能能够从“Parent”指令继承到“Child”指令。

我通过在子级上重复使用父级中的相同指令定义对象来实现此目的,但 Controller /模板字段已更改。

这一切都运行良好,直到我从我的 ParentDirCtrl 中点击观察者。由于某种原因,观察程序似乎已正确设置,监视 mydir.obj1,但不知何故,观察程序回调函数 mydir.obj1 内部变得未定义。

我假设 _.extend/$controller 正在改变 $scope 的工作方式,因此 mydir. obj1 未在 ParentDirCtrl 中定义,但我不确定为什么会出现这种情况。

Plunk

angular.module('plunker', [])

// lodash
.constant('_', _)

.controller('MainCtrl', function($scope, $timeout) {
$scope.obj = {
name: 'John',
age: 30,
};
})


.controller('ParentDirCtrl', function($scope) {
var mydir = this;

mydir.doStuffInParent = function() {
alert('executed from the parent directive');
}

$scope.$watch('mydir.obj1', function() {
// ====================================
// ERROR
// Why is 'mydir.obj1' undefined when
// occupation is set?
// ====================================
mydir.obj1.occupation = 'Meteorologist';
});
})


.directive('parentDirective', parentDirective)


.directive('childDirective', function() {
// borrow the directive definition object from the parent directive
var parentDDO = parentDirective();

// uodate the template and controller for our new directive
parentDDO.template = [
'<div>',
'<p ng-click="mydir.doStuffInParent()">{{mydir.obj1.name}}</p>',
'<p ng-click="mydir.doStuffInChild()">{{mydir.obj1.age}}</p>',
'</div>'
].join('');

parentDDO.controller = function($scope, $controller, _) {
// extend 'this' with the Parent's controller
var mydir = _.extend(this, $controller('ParentDirCtrl', { $scope: $scope }));

mydir.doStuffInChild = function() {
alert("executed from the child directive");
};
};

return parentDDO;
});


// this will be moved to the top during declaration hoisting
function parentDirective() {
return {
restrict:'E',
scope: {},
bindToController: {
obj1: '=',
},
template: '<div>{{mydir.obj1}}</div>',
controller: 'ParentDirCtrl',
controllerAs: 'mydir',
};
}

最佳答案

obj1 填充在子 Controller 实例上 - 这就是为什么 mydir.obj1 在父观察程序中未定义。您可以通过作用域直接访问 obj1 或使用传递给观察者的引用:

$scope.$watch('mydir.obj1', function(val) {
$scope.mydir.obj1.occupation = 'Meteorologist';
// or
val.occupation = 'Meteorologis';
});

这里没有作用域继承 - 两个 Controller 在相同的作用域上运行。 Controller-AS 语法让你感到困惑 - 我会删除它以使事情变得更清晰。

关于javascript - Angular Controller 继承范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38491046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com