2016-07-08 6 views
0

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

app.controller('eventListController', ['$scope', '$http', '$routeParams', function ($scope, $http, $routeParams) { 
    var eventList = this, 
     getEventList = function() { 
      var promise = $http.get('../json/Login.json'); 
      promise.then(function (response) { 
       eventList = response.data; 
      }, function (error) { 
       window.alert('Error' + error); 
      }); 
     }; 

    getEventList(); 
}]); 

It кажется довольно простым, но eventList правильно загружается

Что я делаю неправильно?

Вот примерно то, что выглядит как

{ 
"eventHead": [ 
    { 
     stuff stuff 
    }, 
    { 
     more stuff 
    } 
], 
"success": true 

}

если я сделать

window.alert(eventList); 

после

getEventList(); 

Я получаю [объект Object] JSON , который кажется нормальным

, но если я

window.alert(eventList.success); 

я неопределенными

и, кроме того, мои данные просто не загружается на страницу

+1

Не работает как?Выбрасывает ошибку, не содержит данных или что? – martin

+0

, отредактированный для объяснения –

+0

Откройте консоль браузера и проверьте, что отображается. Попробуйте повторить сценарий с помощью jsfiddle, jsbin ... –

ответ

2

Вы не хотите, чтобы перезаписать ссылку из this (ваш контроллер) с результатом (EDIT: я имею в виду, что вы больше не ссылаетесь на контроллер и вместо этого просто ссылаетесь на данные, которые не будут доступны в представлении). Вы хотите установить свойство на контроллере - я полагаю, вы используете синтаксис controller as? Это будет делать лучше на то, что я думаю, что вы пытаетесь достичь:

app.controller('eventListController', ['$scope', '$http', '$routeParams', function ($scope, $http, $routeParams) { 
    var that = this; 

    var getEventList = function() { 
     var promise = $http.get('../json/Login.json'); 
     promise.then(function (response) { 
      that.eventList = response.data; 
     }, function (error) { 
      console.log('Error', error); 
     }); 
    }; 

    getEventList(); 
}]); 

EDIT: Было отмечено, мне несколько раз, что выше (вопрос) синтаксис является правильным. Я согласен - это просто плохая практика. Вы не должны определять несколько переменных с символами новой строки. Я думаю, что большинство разработчиков javascript согласятся с тем, что это не добавляет читаемости (я думаю, что я неправильно читаю это, это доказывает).

+0

Синтаксис верен, t переопределяет 'this' с результатом. – martin

+0

@Martin Возможно, моя формулировка немного выключена, но синтаксис неверен. Вы можете хранить ссылку на контроллер, но вам нужно установить данные на свойстве на этом контроллере или вы не сможете получить к нему доступ в представлении, поскольку у вас не будет ссылки .... –

+0

'var a , b, c; 'отлично. какую ошибку вы видите в этой строке? – Jai

0

Ваша проблема на самом деле хорошо описана в таких вопросах, как: How do I return the response from an asynchronous call?

Вызова window.alert(eventList); делает возвращение [object Object] потому, что вы назначили его eventList = this.

Функция getEventList() является асинхронной, поэтому ответ не доступен сразу. Вы можете сделать:

var getEventList = function (callback) { 
    var promise = $http.get('../json/Login.json'); 
    promise.then(function (response) { 
     eventList = response.data; 
     callback(eventList); 
    }, function (error) { 
     window.alert('Error' + error); 
    }); 
}; 

getEventList(function(response) { 
    console.log(response.success); 
}); 

Но скорее взглянуть на ответ я уже упоминал выше, и увидеть how to use Promises in Angular.

+0

Я думаю, что вы его сильно напугаете. Все, что вам нужно сделать, - установить данные в $ scope, если вы используете область или свойство на контроллере, как я описал. –

0

Недурно Перо Hornshoj-Schierbeck и Мартин, который поставил меня в правильном направлении, это похоже на работу

app.controller('eventListController', ['$scope', '$http', '$routeParams', function ($scope, $http, $routeParams) { 
    var events= this; 

    var getEventList = function() { 
     var promise = $http.get('../json/Login.json'); 
     promise.then(function (response) { 
      events.eventList = response.data; 
     }, function (error) { 
      window.alert('Error' + error); 
     }); 
    }; 

    getEventList(); 
}]); 

Я надеюсь, что синтаксис является хорошей практикой, если не плохо бы рад получить любую консультацию

+1

затем отметьте его ответ как принятый (зеленый галочка) –

+0

выглядит как я должен ждать два дня –

+1

О синтаксисе. После этого на первой строке я бы поставил точку с запятой, а затем определил новую переменную для getEventList. Его легче читать, когда вы определяете только одну переменную на строку. Также освободите отступ функции getEventList. Он должен быть на том же отступе, что и две другие строки. Проверьте мой ответ еще раз, если вы хотите увидеть, что я имею в виду. –

Смежные вопросы