Idea trong Fiddle đó là tốt đẹp, nhưng tôi thấy việc thực hiện kinda lộn xộn. Vì vậy, những gì có thể làm gì? Vâng, hãy viết một chỉ thị thay thế dropdown
trên đầu trang của ui-bootstrap
, tất nhiên!
Hy vọng bạn thấy điều này hữu ích. Nó sẽ thực sự dễ sử dụng.
Cách sử dụng
<dropdown is-button
ng-model="vm.item"
items="vm.items"
callback="vm.callback(item)">
</dropdown>
Vì vậy, bạn vượt qua trong các ng-model
mà giữ lựa chọn ban đầu, nếu có. Giá trị mới được đặt từ chỉ thị. Trong số items
bạn có bộ sưu tập gồm id-name
cặp để chọn và chức năng callback
nếu bạn cần. Nếu bạn chỉ định thuộc tính is-button
, bạn sẽ nhận được điều khiển thả xuống kiểu nút.
Sau đó, trình điều khiển có thể trông giống như sau.
khiển
// Controller
app.controller('Ctrl', function() {
var vm = this;
// items collection
vm.items = [{
id: 0,
name: 'London'
},{
id: 1,
name: 'Paris'
},{
id: 2,
name: 'Milan'
}];
// current item
vm.item = null; // vm.items[1];
// directive callback function
vm.callback = function(item) {
vm.fromCallback = 'User selected ' + angular.toJson(item);
};
});
Logic cho chỉ thị dropdown
là khá đơn giản, thực sự.
Chỉ JavaScript
// Dropdown directive
app.directive('dropdown', function() {
return {
restrict: 'E',
require: '^ngModel',
scope: {
ngModel: '=', // selection
items: '=', // items to select from
callback: '&' // callback
},
link: function(scope, element, attrs) {
element.on('click', function(event) {
event.preventDefault();
});
scope.default = 'Please select item';
scope.isButton = 'isButton' in attrs;
// selection changed handler
scope.select = function(item) {
scope.ngModel = item;
if (scope.callback) {
scope.callback({ item: item });
}
};
},
templateUrl: 'dropdown-template.html'
};
});
Chỉ HTML template
<div class="btn-group" dropdown>
<!-- button style dropdown -->
<button ng-if="isButton"
type="button"
class="btn btn-primary"
ng-bind="ngModel.name || default">
</button>
<button ng-if="isButton"
type="button"
class="btn btn-primary dropdown-toggle"
dropdown-toggle>
<span class="caret"></span>
</button>
<!-- no button, plz -->
<a ng-if="!isButton"
class="dropdown-toggle"
dropdown-toggle href
ng-bind="ngModel.name || default">
</a>
<span ng-if="!isButton" class="caret"></span>
<!-- dropdown items -->
<ul class="dropdown-menu" role="menu">
<li ng-repeat="item in items">
<a href="#"
ng-bind="item.name"
ng-click="select(item)"></a>
</li>
</ul>
</div>
Dưới đây là giao diện & cảm giác của việc thực hiện ban đầu. Ngoài mẫu bạn đã cung cấp, bạn sẽ lấy lại toàn bộ đối tượng chứ không phải chỉ là id
.
liên quan Plunker đây
http://plnkr.co/edit/bLWabx sử dụng angularjs 1.4.0-beta.3 và ui-bootstrap 0.12.0.
Bạn đang nhắm mục tiêu/hỗ trợ những trình duyệt nào? – Problematic
Có lẽ gán giá trị trực tiếp cho HTML không phải là một ý tưởng hay - bạn có thể sử dụng đối tượng phạm vi cho điều đó. Bạn có thể kiểm tra câu trả lời của tôi cho giải pháp thay thế hiện tại. –
Kiểm tra câu trả lời. Bạn có cách tiếp cận sai ở đây: bạn không cần phải sử dụng .html() –