私はこのコードセットを継承し、何が起こっているのか理解していると思いますが、カスタムの $compile ディレクティブ内で ng-show を動作させることができないようです。グリッドスターと関係があるのではないかと思いますが、同じ効果を得るためにコメントアウトされている行を試しました。
私が取り組んでいるコードを公開することはできないので、これは非常に単純化されたバージョンです。私は実際に恐竜アプリを作っているわけではありませんが、それはいいかもしれません。
各結果をグリッドスターに追加する必要があるため、これには templateUrl を使用できません。さらに多くのことが起こっています。私ができないことをただ信じてください:(
app.directive("tarpit", ["$compile", "gridster", function($compile, gridster) {
return {
scope: {
dinosaurs: "="
},
restrict: "A",
link: function(scope, element, attrs) {
var i, dino;
scope.$watch("dinosaurs", function(dinosaurs, oldDinosaurs) {
for(i = 0; i < dinosaurs.length; i++) {
// scope.dinosaurs is set from a provider higher up our scope chain. each dinosaur contains HTML
dino = angular.element(dinosaurs[i].html);
dino.attr("dinosaur-id", dinosaurs[i].id);
// i suspect these are the problem areas
dino = $compile(dino)(scope);
gridster.add(dino, dinosaurs[i].x, dinosaurs[i].y, dinosaurs[i].col, dinosaurs[i].row);
// i've also tried the following which didnt work
// element.append(dino);
}
}
}
};
}]);
app.directive("dinosaur", function() {
return {
scope: {
dinosaurs: "="
},
restrict: "A",
link: function(scope, element, attrs) {
scope.isExtinct = function() {
// there's more to it than this but you get the idea
for(var i = 0; i < scope.dinosaurs.length; i++) {
if(scope.dinosaurs[i].id == attrs.dinosaurId) {
return true;
}
}
return false;
};
}
};
});
ページは次のように始まります。
<div tarpit dinosaurs="dinosaurs"></div>
恐竜 Web サービスが終了し、$watch を押すと、ページは最終的に次のようになります。
<div tarpit dinosaurs="dinosaurs">
<div dinosaur dinosaurs="dinosaurs" dinosaur-id="111">
<div ng-show="isExtinct()">I'm dead</div>
<div ng-show="!isExtinct()">It's a miracle</div>
</div>
...
<div dinosaur dinosaurs="dinosaurs" dinosaur-id="999">
<div ng-show="isExtinct()">I'm dead</div>
<div ng-show="!isExtinct()">It's a miracle</div>
</div>
</div>
問題は、isExtinct メソッドが呼び出されないことです。
次のことを試してみましたが、対応する結果が得られました。
- isExtinct を 'tarpit' に移動 - 実行されますが、自分がどの恐竜であるかというコンテキストが失われます。$element を渡そうとしましたが、未定義のままです。
- ng-show="$parent.isExtinct()" - 呼び出されません。
- メソッドの代わりにフラグを使用します。上記と同じ結果です。
- tarpit ディレクティブ内の controller() に isExtinct を配置します。#1と同じ結果。メソッドが呼び出されますが、どの恐竜がそれを呼び出したかはわかりません。
$element を親メソッドに渡すか、attr.dinosaurId だけを渡すなど、自分がどの恐竜であるかを把握できる限り、この時点で #1 に落ち着きます。 グリッドスターがそれらを再配置するため、それらが恐竜の配列にマッピングされている順序に依存することはできません。