Tôi đang tạo chỉ thị ui-datetime đơn giản. Nó chia đối tượng javascript Date thành các phần _date, _hours và _minutes. _date sử dụng jquery ui datepicker, _hours và _minutes - số đầu vào.Tôi có thể sử dụng ng-model với phạm vi phân lập được không?
angular.module("ExperimentsModule", [])
.directive("uiDatetime", function() {
return {
restrict: 'EA',
replace: true,
template: '<div class="ui-datetime">' +
'<input type="text" ng-model="_date" class="date">' +
'<input type="number" ng-model="_hours" min="0" max="23" class="hours">' +
'<input type="number" ng-model="_minutes" min="0" max="59" class="minutes">' +
'<br />Child datetime1: {{datetime1}}' +
'</div>',
require: 'ngModel',
scope: true,
link: function (scope, element, attrs, ngModelCtrl) {
var elDate = element.find('input.date');
ngModelCtrl.$render = function() {
var date = new Date(ngModelCtrl.$viewValue);
var fillNull = function (num) {
if (num < 10) return '0' + num;
return num;
};
scope._date = fillNull(date.getDate()) + '.' + fillNull(date.getMonth() + 1) + '.' + date.getFullYear();
scope._hours = date.getHours();
scope._minutes = date.getMinutes();
};
elDate.datepicker({
dateFormat: 'dd.mm.yy',
onSelect: function (value, picker) {
scope._date = value;
scope.$apply();
}
});
var watchExpr = function() {
var res = scope.$eval('_date').split('.');
if (res.length == 3) return new Date(res[2], res[1] - 1, res[0], scope.$eval('_hours'), scope.$eval('_minutes'));
return 0;
};
scope.$watch(watchExpr, function (newValue) {
ngModelCtrl.$setViewValue(newValue);
}, true);
}
};
});
function TestController($scope) {
$scope.datetime1 = new Date();
}
On github: https://github.com/andreev-artem/angular_experiments/tree/master/ui-datetime
Theo như tôi hiểu - thực hành tốt nhất khi bạn tạo ra một thành phần mới là sử dụng phạm vi cô lập.
Khi tôi cố gắng sử dụng phạm vi phân lập - không có gì hoạt động. ngModel. $ viewValue === không xác định.
Khi tôi cố gắng sử dụng phạm vi mới (ví dụ của tôi, không phải là biến thể tốt như vậy imho) - ngModel sử dụng giá trị trên phạm vi mới được tạo.
Tất nhiên tôi có thể tạo chỉ thị với phạm vi phân lập và làm việc với giá trị ngModel thông qua "= expression" (example). Nhưng tôi nghĩ rằng làm việc với ngModelController là một thực hành tốt hơn.
Câu hỏi của tôi:
- Tôi có thể sử dụng ngModelController với phạm vi bị cô lập?
- Nếu không thể giải pháp nào tốt hơn cho việc tạo thành phần như vậy?
Có vẻ như cách giải quyết. Nhưng đối với workaround tôi thích 'phạm vi: true' và' ng-model = "someObj.someProp" ' –