我创建了一个角度多选指令插件。该指令将数组作为输入。如果需要,我们的想法是将所有插件用于当前和未来的项目。 该数组需要采用以下格式:
[
{ id: 1, name: 'Theme1', selected: false },
{ id: 2, name: 'Theme2', selected: false },
{ id: 3, name: 'Theme3', selected: false },
{ id: 4, name: 'Theme4', selected: false },
{ id: 5, name: 'Theme5', selected: false },
{ id: 6, name: 'Theme6', selected: false },
{ id: 7, name: 'Theme7', selected: false },
{ id: 8, name: 'Theme8', selected: false },
{ id: 9, name: 'Theme9', selected: false },
{ id: 10, name: 'Theme10', selected: false }
]
该指令采用上述输入并转换为此[image url]:
http://pho.to/7wl3E
现在我的同事认为,指令总是必须通过上述格式,这是不可见的。 然后他继续建议该指令必须发出一个API $ http请求来从服务器获取数据, 使用返回的数据创建必要的格式。他还坚持在指令中处理预先格式化的数据和$ http调用。
我辩论说,角度指令不是为此目的而做的,如果在指令中使用$ http调用,则涉及很多事情 像API URL,方法[GET,POST],post的有效载荷数据,需要传递给指令,天气预加载数据是否下拉。
所以与这种情况有关,这是我的问题
答案 0 :(得分:1)
很多时候需要某些逻辑的指令(特别是服务器逻辑)被分成指令和服务。
回答问题:
是$ http调用在指令中使用的好习惯吗?
可以想象一个指令,你需要在它可以行动之前从服务器获取一些部分,但它只需要它一次,那么调用一次是一个好主意,值缓存指令的所有其他实例。
但是如果你需要一个自定义http调用每个指令,那么我认为服务是一个更好的方法。
在这种情况下,每个指令都可以从服务器返回某种数据,我认为指令的捆绑服务是一种更好的方法。然后扩展这个逻辑将更容易,更好。
见上文:)
带有指令的捆绑服务:
angular.module('app',[]).service('MultiSelect', ['$http', function($http) {
this.getMyData = function() {
$http.get('....');
};
});
angular.module('app',[]).directive('multieSelect', ['MultiSelect', function(selectService) {
return {
link: function($scope, $el, $attr) {
$scope.selectData = selectService.getMeMyData();
}
}
});
通过这种方式,您可以拥有两个独立的实体,一个在需要的地方多次实例化,另一个实体只负责逻辑。对于他们的许多指令,iirc angular-strap使用这种方法。
我希望有所帮助。
答案 1 :(得分:1)
我认为你的大部分问题都已得到解答,但我可以提出建议。只需从控制器发送格式化的JSON即可。我通常对这样的控件执行的操作不是要求特定格式,而是可以添加displayProperty和keyProperty的范围变量。在你的情况下,它将是id和name然后引用它像yourArray [displayProperty]和yourArray [keyProperty]
答案 2 :(得分:0)
取决于该指令是否是独立功能。 (让我们说你正在制定一个培养自己的指令,而不是用其他任何东西打球)。
我认为$ http调用只应在服务中进行,然后注入控制器(数据必须具有绑定才能达到指令) - 或者如果你真的必须进入指令。
但是,保留对服务的$ http请求可以提高可重用性。
参见上一个答案。
我建议你们看一下Angular JS社区提供的主要风格之一。 一个是http://toddmotto.com/opinionated-angular-js-styleguide-for-teams/。
角度编码方式在很大程度上是可以理解的,并且有很多方法可以做到这一点,其中一些更好。