Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Проблема со связью view и модели (https://javascript.ru/forum/angular/56546-problema-so-svyazyu-view-i-modeli.html)

Alex_D181 21.06.2015 19:23

Проблема со связью view и модели
 
Есть сайт, который ищет фильмы из базы по названию, а потом показывает описание. Приложение состоит из двух контроллеров, каждый на своём шаблоне. Один и тот же функционал реализован в обоих контроллерах, но в первом он работает, а во втором нет:

Код первого контроллера:

filmApp.controller('searchFilmCtrl', function($scope){
    $scope.datas = data.results;

    $scope.totalResul = data.total_results;

    $scope.itemId = data.id;

    $scope.searchFilms = function(){
        function successCB(APIres) {
            APIres = JSON.parse(APIres);
            $scope.setFilms(APIres)
        };
        function errorCB(resul) {
            console.log("Error callback: " + APIres);
        };
        theMovieDb.search.getMovie({"query": $scope.searchName }, successCB, errorCB)

    };
    $scope.datas = data.results;
    $scope.setFilms = function(APIres){

        $scope.datas = APIres.results;
        $scope.totalResul = APIres.total_results;
        console.log($scope.totalResul);

    }
});

И его шаблон
Код:

<div class="b-wrapper" ng-controller="searchFilmCtrl">
    <div class="b-search-row">
        <form ng-submit="searchFilms()">
            <div class="col-md-12 relative">
                <input type="text" class="form-control" ng-model="searchName" placeholder="Ведите название фильма...">
                <input class="b-search-form-submit btn btn-primary" type="submit" value="поиск">
            </div>


        </form>

        <div class="row">
            <span class="col-md-12 h6 b-search_total_resul">Найдено фильмов: {{totalResul}}</span>
        </div>
    </div>
    <div class="b-result-row">
        <div class="b-result-item" ng-repeat="data in datas">
            <a href="#/item/{{data.id}}" class="b-item-film-search col-md-12">
                <span class="col-md-4">
                    <img style="width: 100%;" src="http://image.tmdb.org/t/p/w500/{{data.poster_path}}" alt=""/>
                </span>
                <span class="col-md-8">
                    <span class="h1">{{data.title}}</span>
                    <span class="h4">{{data.release_date}}</span>
                    <span class="descript">{{data.overview}}</span>
                </span>
            </a>
        </div>
    </div>
</div>

Суть проста, пользователь вводит название фильма, я спрашиваю по АПИ результаты поиска, обновляют глобальную переменную data результатом поиска, после чего вывожу результаты.

Самое главное, что работает вот эта конструкция:

$scope.totalResul = data.total_results;

Дальше второй шаблон:


filmApp.controller('itemFilmCtrl', function($scope){

    $scope.filmName = itemFilmData.original_title;


    $scope.getInfoAboutFilm = function(){
        function successCB(APIres){
            APIres = JSON.parse(APIres);
            $scope.setInfo(APIres)

        }

        function errorCB(APIres){
            console.log("Error callback: " + APIres);
        }

        theMovieDb.movies.getById({"id": ''+splitHref[1]+'' }, successCB, errorCB)
    }();


    $scope.setInfo = function(APIres){
        $scope.filmName = APIres.original_title;
        console.log($scope.filmName);
    };



HTML

Код:

<div class="b-wrapper" ng-controller="itemFilmCtrl">
    <div class="b-control b-control--no-bord">
        <a href="#/" class="btn btn-primary">К поиску</a>
        <a href="#/edit" class="btn btn-primary fl-r">Редактировать</a>
    </div>
    <div class="b-item-film col-md-12">
        <div class="b-poster col-md-4">
            <img src="" alt=""/>
        </div>
        <div class="b-descript col-md-8">
            <h1 class="h1">{{filmName}}</h1>
            <p class="h4">Дата релиза</p>
            <p class="descript">Описание фильма</p>
        </div>
    </div>
</div>

<script>

    var href = window.location.href;
    var splitHref = href.split('#/item/');
    //На самом деле создавать глобальную переменную, чтобы передать данные из одного контроллера в другой, не самая хорошая идея.
    //Но как сделать по-другому я пока не разобрался
</script>


ТУт тоже все просто, пользователь заходит на страницу, из урла мы получаем id фильма, по нему запрашиваем информацию, записываем её в переменную itemFilmData и вот тут получается странная особенность. Конструкция:

$scope.filmName = itemFilmData.original_title;

Не работает. Т.е. после получении ответа, и обновлении информации в переменной информация на сайте не обновляется. А должна.

Отсюда вопрос, в чем может быть причина, и почему в первом случае все работает, а во втором нет

grego 22.06.2015 17:58

По поводу splitHref - у ангуляра есть встроенный сервис для работы с урлами $location, его нужно подключить как зависимость в свой контроллер (так же, как ты подключаешь $scope), и с помощью него можно будет распарсить урл и достать айдишку твоего фильма.

Относительно того, что не работает - если я правильно понимаю, то у тебя не обновляется $scope.filmName, которое биндится в темплейт.
В таком случае есть несколько вопросов:
1. $scope.filmName = itemFilmData.original_title; Я не вижу в твоем коде что за переменная-объект itemFilmData. Где он инициализируется и/или модифицируется?
2. метод $scope.setInfo - именно там по идее должен обновляться $scope.filmName, подскажи, этот метод вызывается? Значение APIres.original_title - это именно то, что ты хочешь установить для $scope.filmName? Что выводится в консоль в конце выполнения этого метода?


Часовой пояс GMT +3, время: 20:57.