У меня есть директива actionButtons
:
function actionButtons(){
'use strict';
return {
scope: {},
restrict: 'AE',
bindToController: {
itemId: '@',
itemDescription: '@',
actionsText: '@',
previewAction: '&',
previewText: '@',
editAction: '&',
editText: '@',
removeAction: '&',
removeText: '@'
},
controller: ActionButtonsController,
controllerAs: 'actionButtonsCtrl',
templateUrl: 'src/views/directives/actionButtons.html'
};
}
С контроллером ActionButtonsController
:
/**
*
* @constructor
*/
function ActionButtonsController() {
'use strict';
var viewModel = this;
//not important assertions
}
/**
*
* @type {boolean}
*/
viewModel.hasItemDescription = typeof viewModel.itemDescription === 'string' &&
viewModel.itemDescription.length > 0;
/**
*
* @type {string}
*/
viewModel.previewText = viewModel.previewText || 'preview';
/**
*
* @type {string}
*/
viewModel.editText = viewModel.editText || 'edit';
/**
*
* @type {string}
*/
viewModel.removeText = viewModel.removeText || 'remove';
/**
*
* @type {string}
*/
viewModel.actionsText = viewModel.actionsText || 'Actions';
viewModel.preview = function() {
viewModel.previewAction();
};
viewModel.edit = function() {
viewModel.editAction();
};
viewModel.remove = function() {
viewModel.removeAction();
};
}
И часть его шаблона с кнопкой:
<div class="visible-xs-block btn-group" data-dropdown>
<button class="btn btn-block btn-primary" id="{{::(actionButtonsCtrl.itemId)}}" type="button"
data-dropdown-toggle aria-haspopup="true">
{{actionButtonsCtrl.actionsText}} <span class="sr-only" data-ng-if="::actionButtonsCtrl.hasItemDescription">
for {{::(actionButtonsCtrl.itemDescription)}}</span></button>
</div>
И вот как я называю это в приложении:
<td class="col-md-3 col-xs-3 text-center">
<div data-action-buttons
data-item-id="{{author.id + '_' + author.name + '_' + author.surname}}"
data-item-description="{{author.name + ' ' + author.surname}}"
data-preview-action="authorCtrl.preview(author)"
data-edit-action="authorCtrl.edit(author)"
data-remove-action="authorCtrl.remove(author)"
></div>
</td>
А вот проблемы: как видно из кода контроллера, например actionsText
не требуется, если его нет то будет установлено Actions
. itemDescription
также не требуется. Но если я указываю itemDescription
, то он виден в HTML DOM все время, а Actions
ведет себя очень странно для меня: ему установлено значение по умолчанию Actions
, но он не виден в HTML DOM. Разница между этими двумя заключается в том, что actionsText
привязан к this
в явном виде кода контроллера, но я думал, что это поведение по умолчанию с bindToController
, и это то, что я должен делать, когда хочу установить значение по умолчанию, где значение отсутствует. Кроме того, когда я отлаживаю его (например, вызывая одну из функций), actionsText
имеет значение undefined
, несмотря на то, что если я отлаживаю его при его создании, он устанавливает значение по умолчанию Actions
. Не работает как при одноразовой привязке (с ::
), так и в обычных ситуациях. Возможно, это что-то с scope: {}
из кода директивы, но я не могу понять и надеюсь на вашу помощь - заранее спасибо. P.S. Пробовал вернуть переменную viewModel
из контроллера - не помогло. P.S. 2 Хорошо работает, если указано actionsText
(как data-actions-text={{'Something'}}
)