Я унаследовал некоторый код AngularJS. У этого есть
function MainCtrl($scope)
{
// code goes here
};
angular
.module('inspinia')
.controller('MainCtrl', MainCtrl)
Теперь я хочу добавить пользовательский контроллер, который сочетает в себе датпикер и таймер в один элемент управления. Проект GitHub находится здесь и есть демонстрационный Plunk здесь.
Демонстрационный панк объявляет свой контроллер как
var app = angular.module('app', ['ui.bootstrap', 'ui.bootstrap.datetimepicker']);
app.controller('MyController', ['$scope', function($scope) {
Как добавить это в мой существующий контроллер? Что такое объединенная декларация? Предпочтительно, чтобы я мог использовать его с ng-stricti-di
в моем ng-app
.
[Обновить] здесь мое лучшее предположение, которое я не могу проверить, пока не вернусь домой через 10 часов или около того. Как это выглядит?
var myApp=angular.module('myApp', ['$scope','ui.bootstrap','ui.bootstrap.datetimepicker']);
myApp.controller('MainCtrl', function($scope)
{
// code goes here, and can use ui.bootstrap and ui.bootstrap.datetimepicker
// which were injected into the app module
}]);
[Обновить 2 [Когда я меняю его на
angular
.module('inspinia' ['ui.bootstrap', 'ui.bootstrap.datetimepicker'])
.controller('MainCtrl', MainCtrl)
я получил
Ошибка: [$ injector: nomod] http://errors.angularjs.org/1.5.0/ $ инжектор /nomod? P0 = undefinedError: [$ injector: nomod] http://errors.angularjs.org/1.5.0/ $ инжектор /nomod? p0 = undefined
Despue index.html, имеющий
<script src="js/bootstrap/bootstrap.min.js"></script>
Как мне получить этот проект для использования ui boostrap и его датпикера?
Просмотрите следующие шаги:
Вам не нужно вводить ваш $ scope в объявлении вашего приложения, просто вводите внешние модули, которые вы хотите использовать, для этого случая: "ui.bootstrap" и "ui.bootstrap.datetimepicker".
angular.module('myApp', ['ui.bootstrap','ui.bootstrap.datetimepicker'])
Что такое объединенная декларация?
Поскольку "ui.bootstrap.datetimepicker" зависит только от "ui.bootstrap.dateparser" и "ui.bootstrap.position", но вам нужны также шаблоны и функциональные возможности бутстрапа, которые включены в ui.bootstrap-tpls.js.
Не забудьте включить указанные выше файлы в index.html
<link rel="stylesheet" ref="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.0/ui-bootstrap-tpls.js"></script>
<!-- make sure you download this file from the github project -->
<script src="datetime-picker.js"></script>
Как добавить это в мой существующий контроллер?
Когда вы объявляете свой контроллер, это наследует все зависимые от модуля зависимости, которые вы объявили (ввели) для приложения, поэтому вам не нужно это делать снова. В вашем контроллере вы должны создать литерал объекта для хранения даты, выбранной для пользователя, и переменной, которая будет контролироваться при открытии механизма выбора даты, например:
angular.module('myApp').controller('MainCtrl', ['$scope', function($scope) {
$scope.myDatetime = {
dateSelected: new Date(),
isOpen: false
}
}]);
Вызовите директиву выбора даты и времени в своем html:
<html ng-app-="myApp">
<head> .... </head>
<body ng-controller="MainCtrl">
<div class="input-group">
<input type="text" class="form-control" datetime-picker="MM/dd/yyyy HH:mm" ng-model="myDatetime.dateSelected" is-open="myDatetime.isOpen" />
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="myDatetime.isOpen = !myDatetime.isOpen"><i class="fa fa-calendar"></i></button>
</span>
</div>
</body>
</html>
Надеюсь, это поможет вам.
Основываясь на вашем комментарии в вопросе, ваша путаница связана с тем, как две части кода обрабатывают инъекцию зависимостей. Поэтому, прежде чем я пойду дальше, если вы не прочитали документацию об инъекции зависимостей, тогда остановитесь прямо здесь и прочитайте ее. У него будут все ваши ответы и многое другое, и вам нужно знать, обрабатывать ли углы дольше пяти минут.
Чтобы ответить на конкретный случай, который у вас есть, верхний код, который вы указали, использует неявный впрыск для контроллера, который работает, но не безопасен для минимизации и не рекомендуется. Образец кода, который вы нашли, использует для ввода значения для зависимостей массива, который лучше и безопаснее для минимизации. Объявление приложения во втором примере представляет собой стандартную инъекцию зависимости от модуля и не должно выглядеть иначе, чем то, что вы уже имеете в своем приложении.
Таким образом, чтобы использовать код, который вы нашли, все, что вам нужно сделать, это добавить правильные зависимости модуля к вашему приложению:
angular.module('inspinia', ['ui.bootstrap', 'ui.bootstrap.datetimepicker']);
angular.module('inspinia').controller('MainCtrl',MainCtrl);
function MainCtrl($scope) { }
У вашего контроллера, похоже, уже есть правильные зависимости, поэтому его не нужно менять (что, скажем, ему не нужно ничего за пределами $scope
). Я использовал код из вашего первого примера, чтобы показать, как будет обновляться текущий код, но в идеале вы бы использовали вторую версию инъекции зависимости для своего контроллера.
Обновление, которое у вас есть с ошибкой, связано с тем, что модуль ui.bootstrap не является частью бутстрапа, а является частью проекта углового бутстрапа. Вам нужно включить эти js на свою страницу.
Было бы ошибкой, если бы я не пошел дальше и упомянул, что есть третий способ сделать инъекцию зависимостей, используя службу $inject
. Это предпочтительнее в ряде популярных руководств по стилю, потому что легко использовать бегун задачи для автоматизации. Это, пожалуй, лучший вариант для использования по этой причине.
.controller('MainCtrl', MainCtrl, ['ui.bootstrap', 'ui.bootstrap.datetimepicker'])
?
angular.module('inspinia', [])
которому вы добавите зависимости своего приложения.
Вот минимальное приложение, которое вам нужно будет использовать для этого datepicker
Html:
<body ng-app="inspinia">
<div ng-controller="MainCtrl as ctrl">
<h1>Datepicker Demo</h1>
<div class="row">
<div class="col-md-6">
<p class="input-group">
<input type="text" class="form-control" uib-datepicker-popup ng-model="ctrl.dt" is-open="ctrl.opened" close-text="Close" />
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="ctrl.open()"><i class="glyphicon glyphicon-calendar"></i></button>
</span>
</p>
</div>
</div>
</div>
</body>
JavaScript:
(function() {
'use strict';
angular.module('inspinia', ['ui.bootstrap']);
angular.module('inspinia').controller('MainCtrl', MainCtrl);
function MainCtrl() {
this.open = function() {
this.opened = true;
};
this.opened = false;
}
})();
Здесь я создал плункер для вас, чтобы вы могли попробовать: