我正在构建一个新的 SPA 前端来替换现有企业的旧系统大杂烩,这些系统已经过时且需要更新。我是 Angular 的新手,想看看社区是否可以给我一些观点。我会陈述我的问题,然后问我的问题。
我必须根据.js
包含的数据生成几个系列的复选框,数据如下:
$scope.fieldMappings.investmentObjectiveMap = [
{'id':"CAPITAL PRESERVATION", 'name':"Capital Preservation"},
{'id':"STABLE", 'name':"Moderate"},
{'id':"BALANCED", 'name':"Moderate Growth"},
// etc
{'id':"NONE", 'name':"None"}
];
复选框是使用创建的ng-repeat
,如下所示:
<div ng-repeat="investmentObjective in fieldMappings.investmentObjectiveMap">
...
</div>
但是,我需要复选框表示的值映射到不同的模型(不仅仅是 2 路绑定到 fieldmappings 对象)。destarray
为此,我创建了一个指令,它接受一个最终映射到模型的目标数组。我也知道我需要处理一些非常具体的 gui 控件,例如,如果选中了其他任何内容,则取消选中“无”,或者如果没有选中其他所有内容,则选中“无”。此外,“无”不会是每组复选框中的选项,因此该指令需要足够通用以接受一个验证函数,该函数可以checked
根据已单击的内容调整复选框组输入的状态,但足够聪明如果没有调用选项,则不要中断"NONE"
. 我开始通过添加一个调用控制器中的函数的 ng-click 来做到这一点,但是在查看堆栈溢出时,我读到有人说将 DOM 操作代码放在控制器中是不好的——它应该放在指令中。那么我需要另一个指令吗?
到目前为止:(html):
<input my-checkbox-group
type="checkbox"
fieldobj="investmentObjective"
ng-click="validationfunc()"
validationfunc="clearOnNone()"
destarray="investor.investmentObjective" />
指令代码:
.directive("myCheckboxGroup", function () {
return {
restrict: "A",
scope: {
destarray: "=", // the source of all the checkbox values
fieldobj: "=", // the array the values came from
validationfunc: "&" // the function to be called for validation (optional)
},
link: function (scope, elem, attrs) {
if (scope.destarray.indexOf(scope.fieldobj.id) !== -1) {
elem[0].checked = true;
}
elem.bind('click', function () {
var index = scope.destarray.indexOf(scope.fieldobj.id);
if (elem[0].checked) {
if (index === -1) {
scope.destarray.push(scope.fieldobj.id);
}
}
else {
if (index !== -1) {
scope.destarray.splice(index, 1);
}
}
});
}
};
})
.js 控制器片段:
.controller( 'SuitabilityCtrl', ['$scope', function ( $scope ) {
$scope.clearOnNone = function() {
// naughty jQuery DOM manipulation code that
// looks at checkboxes and checks/unchecks as needed
};
上面的代码已经完成并且工作正常,除了 中的淘气 jquery 代码clearOnNone()
,这就是我写这个问题的原因。
这是我的问题:在这一切之后,我对自己想——如果我只是用我的控制器中编写的 jQuery 手动处理所有这些 GUI 逻辑和验证垃圾,我就已经可以完成了。写这些复杂的指令,让未来的开发者更加困惑,比我写的 jQuery 代码更愚蠢,99% 的人一眼就能理解?其他开发人员如何划清界限?
我看到整个堆栈溢出。例如,这个问题似乎可以用十几行简单的 jQuery 来回答,但他选择了有角度的方式,有一个指令和一个部分......对于一个简单的问题似乎需要做很多工作.
我不希望这个问题违反规则,所以具体来说,我想我想知道:我应该如何编写检查是否已选择“无”的代码(如果它作为这组中的一个选项存在)复选框),然后相应地选中/取消选中其他框?更复杂的指令?我不敢相信我是唯一一个为了满足一个固执己见的框架而必须实现比所需更复杂的代码的开发人员。我需要使用另一个实用程序库吗?