2016-10-19 13 views
1

相同的依赖问题,我有一个应用模块,其中包括另一个模块,例如模块一个b。但是模块ab取决于模块c。请参阅以下如何设计两个模块包括angularjs

var app = angular.module('app', ['a', 'b']); 

app.controller('AppCtrl', function(Containner) { 
    console.log(Containner); //Avaiable 
}); 

var a = angular.module('a', ['c']); 

a.controller('ACtrl', function(Containner) { 
    console.log(Containner); //Avaiable 
}); 

var b = angular.module('b', ['c']); 

b.controller('BCtrl', function(Containner) { 
    console.log(Containner); //Avaiable 
}); 

var c = angular.module('c', []); 

c.factory('Containner', function() { 
    return { 
    test: 'test' 
    } 
}); 

据我了解,你只需要包含一个模块一次,然后您可以访问它在其他模块,甚至你不把它作为其依赖。参见以下内容

var app = angular.module('app', ['a', 'b']); 

app.controller('AppCtrl', function(Containner) { 
    console.log(Containner); 
}); 

var a = angular.module('a',[]); 

a.controller('ACtrl', function(Containner) { 
    console.log(Containner); //YOU CAN STILL GET IT 
}); 

var b = angular.module('b', ['c']); 

b.controller('BCtrl', function(Containner) { 
    console.log(Containner); 
}); 

var c = angular.module('c', []); 

c.factory('Containner', function() { 
    return { 
    test: 'test' 
    } 
}); 

模块A没有C作为其依赖项,但它仍然可以访问C的服务。也就是说,只要你在一个地方包含C,就可以在任何其他模块中使用,只要它们全部包含在角度应用程序中。

我更喜欢第一段代码,因为每个模块都清楚地告诉开发者自己的依赖关系。然而,这似乎是多余的,因为你只需要包含一次,并且可以在其他地方使用。这种情况的最佳做法是什么,角度如何处理幕后重复的依赖关系。

+0

如果你在'app.js'中包含了依赖关系,那么它将始终可用于完整的项目。如果你只在一个文件中添加了依赖项,那么你必须在每次需要时添加它,因为它只能用于该特定文件,所以最好的做法是将它添加到应用程序主文件中,即'app.js'。并且在你的场景中,在一个地方添加'a','b','c'只有'app.js',这样你就可以相互使用所有依赖关系 –

+0

@ojuskulkarni我会说最好的做法是为模块应用程序)始终只包含它直接使用的模块。在这种情况下,如果应用程序模块使用a和b而不是c,它应该列出a和b而不是c作为其依赖项。如果模块a使用模块c,则应列出模块c等。在模块化构建时,您必须模块化思考,并使模块便于携带并可重复使用。 – plong0

回答

1

第一种方式绝对是因为几个原因。

首先,它非常清楚,并且不依赖于任何神秘的,未传达的期望,即另一个模块将其依赖包括在内。其次,为了可重用性是模块化设计的核心方面,如果您想在模块“b”不存在的应用中使用该模块,则需要使用

我会说最好的做法是模块总是只列出它直接使用的模块。

如果app使用ab但不c那么就应该列出其依赖关系为['a', 'b']但不c

如果a使用c那么它应该列出其依赖['c']

代码应写入尽可能清楚,并留下一个程序员问的几个问题越好。 (我真的不想问为什么模块c不被包含,如果它被引用的话)

+1

另请注意,第二个示例显示了角度设计中的缺陷,并不是任何方式的“特征”。 – tcooc