Javascript 两个控制器,一个角度范围变量

Javascript 两个控制器,一个角度范围变量,javascript,angularjs,Javascript,Angularjs,好的,我有两个控制器,控制站点的两个明显不同的部分,它们在同一个页面上 第一种是通讯注册表,第二种是购物篮。第二个不是作为ng controller指令直接放置在DOM中,而是作为自定义指令的控制器 一些代码: <div ng-controller="newsletter-signup"> <div ng-show="showLoader"> ... Cool loading animation here ... </div>

好的,我有两个控制器,控制站点的两个明显不同的部分,它们在同一个页面上

第一种是通讯注册表,第二种是购物篮。第二个不是作为
ng controller
指令直接放置在DOM中,而是作为自定义指令的控制器

一些代码:

<div ng-controller="newsletter-signup">
    <div ng-show="showLoader">
        ... Cool loading animation here ...
    </div>

    ... Form in here ...
</div>

<div basket>
    <div ng-show="showLoader">
        ... Cool loading animation here ...
    </div>

    ... Basket data in here ...
</div>
然而,当任一控制器中的
$scope.showLoader
true
时,新闻稿和购物篮上都会显示此get

我似乎不知道如何将作用域彼此隔离,但继续使用相同的变量名

basket指令如下所示:

return {
    link : linkFn,
    scope: '=',
    restrict : 'A',
    controller : 'BasketController'
};
BasketController
从未在模板中定义

我怎样才能解决这个问题

我不希望通讯的
div
在更新通讯篮时显示,同样,我也不希望通讯篮的
div
在更新通讯篮时显示

编辑:我们使用以下内容来定义组件,我想知道这是否是根本原因

window.angular.module('Basket', []);
window.angular.module('App', ['Basket']);

正如@jme11所发布的,您需要将作用域键传递给一个对象,以便获得一个隔离的作用域

在这两个地方,变量是不同的,因此定义变量的第一个地方可以是true或false。但是,第二位是隔离作用域,除非我们直接将变量传递给它,否则它将保持未定义状态,这是JS中的一个falsy值,因此ng show将不会传递

这里有一支笔可以更好地说明这个问题

return {
    link : linkFn,
    scope: {
      showLoader: '='
    },
    restrict : 'A',
    controller : 'BasketController'
};

在指令中,可以使用
作用域:{}
创建一个独立的作用域。但是basket指令有模板吗?根据你发布的内容,我只是不明白它是做什么的。篮子是附加到某些动态内容的包装
div
的属性。它没有自己的模板。我将更新更清楚。两个div是否都有一个共同的父级,其作用域也可能包含一个“showLoader”变量?@SebastianS
div
的父级永远不会包含
showLoader
,它也没有自己的作用域。我正试图将两者彼此隔离。@默认情况下,AlexMcCabe非嵌套控制器是隔离的,因此问题是:祖先元素上会发生什么情况。感谢您的帮助,但我仍然有一些问题。到目前为止,在我用Angular所做的一切尝试中,孤立的示波器给我带来了最大的麻烦。我用叉子叉了你的笔,改变了一些东西,使之更接近我使用它的目的,但是我无法理解:请查看编辑,看看这是否是问题的一部分?超级接近,但隔离范围也适用于函数和变量!哎呀,我不小心把笔写得太多了。。。但是无论如何,忘记孤立的范围,因为它不需要,只会造成更多的混乱。不幸的是,这是我以前的经历。无论如何,我相信我已经找到了问题的根源。我们定义单个模块,然后将它们称为
应用程序
模块的依赖项,这意味着一切都在全局范围内。我们无法在此阶段重新编写应用程序,因此我必须找到其他路径。谢谢你的帮助。没问题,如果有帮助的话,我可以展示我意外删除的隔离作用域示例!
return {
    link : linkFn,
    scope: {
      showLoader: '='
    },
    restrict : 'A',
    controller : 'BasketController'
};