Угловые часы не срабатывают

0

$ watch не срабатывает, тогда я меняю свой datepicker. Зачем?

Обновление: я заметил, что мои offDate и returnDate не меняются при выборе новой даты. Что может быть причиной?

 var app = angular.module("fly");

(function(){

    function Controller($scope, searchData) {



        $scope.$watch('departDate', function(newValue, oldValue){

            $scope.departDate = newValue;
            searchData.setDateFrom(newValue);

            if(searchData.getDateFrom() > searchData.getDateTo()) {
                searchData.setDateFrom(newValue);
                searchData.setDateTo(newValue);
                $scope.returnDate = newValue;

            }

        });

        $scope.$watch('returnDate', function(newValue, oldValue){

            $scope.returnDate = newValue;
            searchData.setDateTo(newValue);

            if(searchData.getDateFrom() > searchData.getDateTo()) {
                searchData.setDateFrom(newValue);
                searchData.setDateTo(newValue);
                $scope.departDate = newValue;
            }

        });


        $scope.datePickerStates = {
            open1:false,
            open2:false
        };

        $scope.open = function($event, opened) {
            $event.preventDefault();
            $event.stopPropagation();

            $scope.datePickerStates[opened] = true;
        };


        $scope.today = function() {
            $scope.dt = new Date();
        };
        $scope.today();

        $scope.clear = function () {
            $scope.dt = null;
        };

        $scope.toggleMin = function() {
            $scope.minDate = $scope.minDate ? null : new Date();
        };
        $scope.toggleMin();

        $scope.dateOptions = {
            formatYear: 'yyyy',
            startingDay: 1
        };

        $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
        $scope.format = $scope.formats[0];

    }

    app.controller('DatePickerController', Controller);


})();

HTML:

    <div class="col-md-2">
        <div class="input-group">
            <input type="text" class="form-control" datepicker-popup="{{format}}"  min-date="minDate" ng-model="departDate" is-open="datePickerStates.open1" ng-required="true" close-text="Close" />
            <span ng-click="open($event, 'open1')" class="btn btn-default input-group-addon">
                <span class="glyphicon glyphicon-calendar"></span>
            </span>
        </div>

    </div>

    <div class="col-md-2">
        <div class="input-group">
            <input type="text" class="form-control" datepicker-popup="{{format}}"   min-date="minDate" ng-model="returnDate" is-open="datePickerStates.open2" ng-required="true" close-text="Close" />
            <span ng-click="open($event, 'open2')" class="btn btn-default input-group-addon">
                <span class="glyphicon glyphicon-calendar"></span>
            </span>
        </div>
    </div>

ОБНОВИТЬ:

Это, когда я объявляю свои вложенные контроллеры и использую директивы.

<div ng-controller="DatePickerController">
    <div ng-controller="PassengerController as pd">
        <div ng-controller="PlaceController as pc">
            <search-bar-md></search-bar-md>
            <search-bar-sm></search-bar-sm>
            <search-bar-xs></search-bar-xs>

            <pre>{{departDate}}</pre>
            <pre>{{returnDate}}</pre>

        </div>
    </div>
</div>

app.js

var app = angular.module("fly", ['ui.bootstrap', 'ngAnimate']);


app.factory('searchData', function () {

    var data = {
        travelFrom: '',
        travelTo: '',
        dateToday: new Date(),
        dateFrom: new Date(),
        dateTo: new Date()
    };

    return {
        getTravelFrom : function() {
            return data.travelFrom;
        },
        setTravelFrom : function(travelFrom){
            data.travelFrom = travelFrom;
        },
        getTravelTo : function(){
            return data.travelTo;
        },
        setTravelTo : function(travelTo){
            data.travelTo = travelTo;
        },
        /*** Travel dates ***/
        getTodayDate : function(){
            return data.dateToDay;
        },
        getDateFrom : function(){
            return data.dateFrom;
        },
        setDateFrom : function(dateFrom){
            data.dateFrom = dateFrom;
        },
        getDateTo : function(){
            return data.dateTo;
        },
        setDateTo : function(dateTo){
            data.dateTo = dateTo;
        }

    };
});




app.directive('navBar', function() {
    return {
        restrict: 'E',
        templateUrl: 'templates/navbar/navbar.html'
    };
});


app.directive('searchBar', function() {
    return {
        restrict: 'E',
        templateUrl: 'templates/search-bar/search-bar.html'
    };
});

app.directive('searchBarMd', function() {
    return {
        restrict: 'E',
        templateUrl: 'templates/search-bar/search-bar-md.html'
    };
});

app.directive('searchBarSm', function() {
    return {
        restrict: 'E',
        templateUrl: 'templates/search-bar/search-bar-sm.html'
    };
});

app.directive('searchBarXs', function() {
    return {
        restrict: 'E',
        templateUrl: 'templates/search-bar/search-bar-xs.html'
    };
});
  • 0
    Я не вижу ни одного указателя даты, который использует ни одну из этих переменных, которые вы смотрите, перечисленных здесь.
  • 0
    @ Клайс, прости! Под редакцией!
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

Создание объекта-оболочки должно решить его: http://plnkr.co/edit/o8iwrVIYJq9wG74f0uR0?p=preview

Основное изменение заключается в добавлении объекта-оболочки в DatePickerController:

$scope.dates = {}

Затем используйте этот объект, чтобы сохранить даты следующим образом:

<div ng-controller="DatePickerController">
    <div class="col-md-2">
        <div class="input-group">
            <input type="text" class="form-control" datepicker-popup="{{format}}"  min-date="minDate" ng-model="dates.departDate" is-open="datePickerStates.open1" ng-required="true" close-text="Close" />
            <span ng-click="open($event, 'open1')" class="btn btn-default input-group-addon">
                <span class="glyphicon glyphicon-calendar"></span>
            </span>
        </div>

    </div>

    <div class="col-md-2">
        <div class="input-group">
            <input type="text" class="form-control" datepicker-popup="{{format}}"   min-date="minDate" ng-model="dates.returnDate" is-open="datePickerStates.open2" ng-required="true" close-text="Close" />
            <span ng-click="open($event, 'open2')" class="btn btn-default input-group-addon">
                <span class="glyphicon glyphicon-calendar"></span>
            </span>
        </div>
    </div>
</div>

Причина этого заключается в том, что ng-model заменяет экземпляры ссылочных объектов другими. Каждый контроллер имеет свою собственную область действия, но наследует от нее родительскую область, но при использовании вложенных контроллеров с ng-моделью изменяется только объект промежуточной области $ scope. Например, если у нас есть контроллер1 и вложенный контроллер2:

//Initial state:
controller1Scope.property='initial'
controller2Scope.property='initial' //Inherited from controller1 scope

//After ng-model="property" input is changed to 'new_value':
controller1Scope.property='initial'
controller2Scope.property='new_value'

Если вы используете объект-оболочку, он делится во всех областях и когда некоторые из его свойств изменяются, это затрагивает все из них:

//Initial state:
controller1Scope.wrapper={property:'initial'}
controller2Scope.wrapper={property:'initial'} //Inherited from controller1 scope

//After ng-model="wrapper.property" input is changed to 'new_value':
controller1Scope.wrapper={property:'new_value'}
controller2Scope.wrapper={property:'new_value'} //Inherited from controller1 scope
  • 0
    Я вложил контроллеры, наверное, в этом причина. Если я перемещаю контроллер на один уровень с датчиками, все работает хорошо, как вы сказали, почему это не работает, когда я использую несколько вложенных контроллеров? Обновление моего вопроса в секунду.
  • 0
    Вы пробовали контроллер как синтаксис? Возможно, по какой-то причине средство выбора даты использует область действия, отличную от области вашего контроллера, вероятно, самую верхнюю область в $ rootScope.
Показать ещё 8 комментариев
0

Инициализируйте $scope.departDate и $scope.returnDate в контроллере с некоторым значением по умолчанию.
JS:

function Controller($scope, searchData) {
    $scope.departDate = ''; //you can set your own default value
    $scope.returnDate = ''; //you can set your own default value
... }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню