時代遅れで更新が必要な既存の企業のレガシー システムの寄せ集めを置き換えるために、新しい 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>
ただし、チェックボックスで表される値を別のモデルにマップする必要がありました (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ロジックと検証ジャンクを手動で処理した場合、私はすでに完了していた可能性があります。私たちの 99% が一目で理解できる jQuery コードを書いた場合よりも、将来の開発者が困惑しなければならないこれらの複雑なディレクティブを作成することが、どの時点でばかげたことになるのでしょうか? 他の開発者はどのように線を引いていますか?
これはスタックオーバーフロー全体に見られます。たとえば、この質問は、数十行の単純な jQuery で回答できるように見えますが、ディレクティブとパーシャルを使用して角度のある方法で回答することを選択しました...単純な問題の場合、多くの作業が必要なようです.
この質問がルールに違反することを望まないので、具体的には、「なし」が選択されているかどうかを確認するコードをどのように記述すべきかを知りたいと思います(このグループのオプションとして存在する場合)チェックボックス)、それに応じて他のボックスをチェック/チェック解除しますか? より複雑なディレクティブですか? 独断的なフレームワークを満たすためだけに、必要以上に複雑なコードを実装しなければならない開発者が私だけだとは信じられません。使用する必要がある別の util ライブラリはありますか?