spinner-click
次のディレクティブを検討してください。
ディレクティブの使用:
<button class="btn btn-mini"
ng-class="{'btn-warning': person.active, disabled: !person.active}"
spinner-click="deleteItem($index)"
spinner-text="Please wait..."
spinner-errors="alerts">
Delete
</button>
指令:
app.directive('spinnerClick', function() {
return {
restrict: 'A',
scope: true,
link: function(scope, element, attrs) {
var originalHTML = element.html();
var spinnerHTML = "<i class='icon-refresh icon-spin'></i> " + attrs.spinnerText;
element.click(function() {
if (element.is('.disabled')) {
return;
}
element.html(spinnerHTML).addClass('disabled');
scope.$apply(attrs.spinnerClick).then(function() {
element.html(originalHTML).removeClass('disabled');
}, function(errors) {
element.html(originalHTML).removeClass('disabled');
// This is ugly! Is there a better way?
var e = scope[attrs.spinnerErrors];
e.length = 0;
e.push.apply(e, errors);
});
});
}
};
});
コントローラ:
app.controller('MainCtrl', function($scope, $q, $timeout) {
$scope.alerts = ['First alert'];
$scope.people = [
{ name: 'David', active: true },
{ name: 'Layla', active: false }
];
$scope.deleteItem = function(index) {
var defer = $q.defer();
$timeout(function() {
defer.reject(["Something 'bad' happened.", "Check your logs."]);
}, 2000);
return defer.promise;
};
});
注: spinner-click
他のディレクティブと共に使用できます (例:ng-class
この例)。
ご覧のとおり$scope.alerts
、非常に厄介な方法でディレクティブを設定しています。これを行うためのより良い方法を見つけることができますか?
更新: (デモ)
私は$parse
このように使用しようとしました:
var errorsModel = $parse(attrs.spinnerErrors);
errorsModel.assign(scope, errors);
これは機能しません。
しかし、私が持っているのspinner-errors="wrapper.alerts"
ではなくspinner-errors="alerts"
、それはうまくいきます!
ラッパーの使用を避ける方法はありますか?