AngularJS中的方法重载\重写

AngularJS中的方法重载\重写,angularjs,angularjs-scope,angularjs-routing,Angularjs,Angularjs Scope,Angularjs Routing,我有一个场景,我有一个共享按钮,我有一个容器控制器,叫做Metatrl,它位于html标记上 还有内部控制器 我有一个share按钮,它在单击时调用model.share()函数 代码: 共享页面的控制器本身: app.controller('shareCtrl', function($scope)){ $scope.layout.shareVisible = $location.path().share == 1 ? true : false; $scope.model.share

我有一个场景,我有一个共享按钮,我有一个容器控制器,叫做Metatrl,它位于html标记上

还有内部控制器

我有一个share按钮,它在单击时调用model.share()函数

代码:

共享页面的控制器本身:

app.controller('shareCtrl', function($scope)){
 $scope.layout.shareVisible = $location.path().share == 1 ? true : false;
    $scope.model.share = function(){
         $scope.layout.shareVisible = $scope.layout.shareVisible ? false : true;
         var shareUrlValue = $scope.layout.shareVisible ? 1 : null;

         $location.search('share', shareUrlValue);
    }
});
其思想是在整个应用程序中使用相同的HTML模式,但仅切换共享页面上的共享部分(如果用户已经在那里),并将用户发送到共享视图(如果用户当前不在那里)


问题是,在我转到sahre页面,然后返回到另一个页面后,函数share()引用了shareCtrl中的函数,而不是metaCtrl。

我不确定这里是否有足够的信息,但我会尝试一下(我无法评论,因为我没有足够的rep)。请注意,您的shareCtrl并没有创建新的模型对象,您只是在分配$scope.model.share=func

该赋值将覆盖父控制器中的函数,因为Angular将沿着作用域链查找模型对象

请看这个Plunker:


请注意,当$scope.model={}在shareCtrl中被注释掉时,两个字段的值都是“shareCtrl”。但是,如果您取消对该行的注释,那么$scope.model在shareCtrl范围内,因此Angular不会进入范围链查看。

您能提供更多信息吗?你的html是什么样的?您的routeProvider配置是什么样的?元控制器位于HTML标记上,另一个控制器是来自路由器的视图特定控制器。我还缺少什么?我相信angular运行路由配置中定义的控制器功能,所以你必须换一种方式思考。如果我正确理解了您的问题,您可能会考虑在路由更改中使用拦截器,如果用户需要从AngularJS的父控制器访问父控制器,则重定向到共享页面。在调试器中查看我的Plunker。您可以看到shareCtrl$scope对象的原型是Metatrl$scope对象。由于您没有在shareCtrl$scope对象上创建“model”属性,分配将转到原型的“model”属性。我是说,无法从angularNot true中的子范围修改父范围。在我的口袋里试试看。我的理解是,您可以在父范围中创建与成员同名的成员。但一旦您超出该范围,则引用将指向父范围。
app.controller('shareCtrl', function($scope)){
 $scope.layout.shareVisible = $location.path().share == 1 ? true : false;
    $scope.model.share = function(){
         $scope.layout.shareVisible = $scope.layout.shareVisible ? false : true;
         var shareUrlValue = $scope.layout.shareVisible ? 1 : null;

         $location.search('share', shareUrlValue);
    }
});