2015-03-04 1 views
0

Я играю с приложением AngularJs (я полностью новичок!), Потребляя API REST с помощью Slim PHP через $ http (следующий шаг: $ resource, я знаю). Это все работает отлично при извлечении данных из API, когда диспетчерские написано так:

angular 
    .module("adminTaller", ['ngRoute']) 
      ... 
    .controller("CustomersListController", ['$http', function($http){ 
     var ctrl = this; 
     ctrl.customers = []; 
     $http.get('api/customers') 
      .success(function(data, status, headers, config){ 
       ctrl.customers = data; 
      }) 
      .error(function (data, status, headers, config) { 
       ... 
      }); 
    }]); 

В «клиентах» отображается в этом представлении:

<div ng-controller="CustomersListController as lstCtrl"> 
<input type="text" ng-model="searcher" /> 
<table> 
    <thead> 
    <tr> 
     <th>Apellido y Nombres</th> 
     <th>Domicilio</th> 
     <th>TE Celular</th> 
     <th>TE Comercial</th> 
     <th>TE Domicilio</th> 
     <th>Acciones</th> 
    </tr> 
    </thead> 
    <tbody ng-repeat="customer in lstCtrl.customers | filter:searcher | orderBy: fullname"> 
    <tr> 
     <td>{{ customer.fullname }}</td> 
     <td>{{ customer.address }}</td> 
     <td>{{ customer.cellphone }}</td> 
     <td>{{ customer.businessphone }}</td> 
     <td>{{ customer.homephone }}</td> 
     <td><a href="#">Editar</a></td> 
    </tr> 
    </tbody> 
</table> 

Но в данный момент я заменить это по $ объем:

angular 
    .module("adminTaller", ['ngRoute']) 
       ... 
    .controller("CustomersListController", ['$http', '$scope', function($http, $scope){ 
      var ctrl = $scope; 
      ctrl.customers = []; 
      $http.get('api/customers') 
       .success(function(data, status, headers, config){ 
        ctrl.customers = data; 
       }) 
       .error(function (data, status, headers, config) { 
        ... 
       }); 
     }]) 

, ничего, кажется, происходит (я имею в виду, нет «Список клиентов» не будет загружен в таблице), и Batarang дает мне странное предупреждение (консоль Хрома ничего не говорит, если Batarang отключен): интерпретированы

ресурсов в качестве сценария, но передаются с MIME тип применение/х-JS

Мой апи/index.php задает тип содержимого для приложения/JSON:

$app = new Slim(); 

$app->response()->header('Content-Type', 'application/json'); 

$app->get('/customers', 'getCustomers'); 
$app->post('/customers', 'addCustomer'); 
$app->get('/customers/:id', 'getCustomer'); 
$app->put('/customers/:id', 'updateCustomer'); 
$app->delete('/customers/:id', 'deleteCustomer'); 

$app->run(); 

И в самом деле, запрос HTTP и ответа HTTP заголовки выглядят хорошо мне:

Remote Address:[::1]:8080 
Request URL:http://localhost:8080/ng-taller/api/customers 
Request Method:GET 
Status Code:200 OK 
**Request Headers** 
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:es-ES,es;q=0.8,en;q=0.6,pt;q=0.4 
Connection:keep-alive 
Cookie:__ngDebug=true; PHPSESSID=b8cedd49edcc461fda62208e66cfb150; b8cedd49edcc461fda62208e66cfb150=DEFAULT%7C0%7C2M3TMlgUx3gTlaarYzHIdD28l8q9FTcNubt55%2BUGpAo%3D%7C7456bf61db3500c8bb7b3bc38082a470ce4a2ad3 
Host:localhost:8080 
Referer:http://localhost:8080/ng-taller/index.html 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36 
**Response Headers** 
Connection:Keep-Alive 
Content-Length:1027 
Content-Type:application/json 
Date:Wed, 04 Mar 2015 00:26:12 GMT 
Keep-Alive:timeout=5, max=97 
Server:Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.19 
Set-Cookie:b8cedd49edcc461fda62208e66cfb150=DEFAULT%7C0%7C2M3TMlgUx3gTlaarYzHIdD28l8q9FTcNubt55%2BUGpAo%3D%7C7456bf61db3500c8bb7b3bc38082a470ce4a2ad3; path=/ 
X-Powered-By:PHP/5.4.19 

Когда я инспектировать вида по области видимости/модель с Batarang, он показывает:

{ 
lstCtrl: { } 
customers: 
[ { 
id: 2 
createdAt: 03-03-2015 
fullname: Abelardini, Antonio Miguel 
address: Virasoro Nº2533, Piso 3º - Rosario 
cellphone: 341 (15)562-4484 
businessphone: 341 430-4574 
homephone: 
observations: 
logs: 
[ ] 
errors: 0 
} , { 
id: 1 
createdAt: 03-03-2015 
fullname: Alvarez, Juan 
address: Gallo Nº1254 (entre Nuria y Valdez) - Rosario 
cellphone: 341 (15)485-6225 
businessphone: 
homephone: 
observations: Puntual en el pago 
logs: 
[ ] 
errors: 0 
} , { 
id: 4 
createdAt: 03-03-2015 
fullname: Blanco de Escalada, María de las Mercedes 
address: Av. Álvarez Thomas Nº1542, Piso 11º Depto.'A' - Rosario 
cellphone: 341 (15)326-5484 
businessphone: 
homephone: 
observations: 
logs: 
[ ] 
errors: 0 
} , { 
id: 3 
createdAt: 03-03-2015 
fullname: Tirado López, Juan Manuel 
address: Costanera Nº12 (Bajada de los Pescadores) - Rosario 
cellphone: 341 (15)675-1125 
businessphone: 
homephone: 3205 124-8586 
observations: 
logs: 
[ ] 
errors: 0 
} ] 
} 

Я m тратить дни на поиск и пробовать разные подходы, но я не могу найти выход, я бы очень признателен за любую полезную руку!

+0

Если вы хотите использовать '$ scope', просто используйте' $ scope' (нет необходимости назначать его 'ctrl'). Вы также захотите отбросить 'как lstCtrl' и просто ссылку' customers' непосредственно в HTML. Вероятно, вы должны прочитать, когда использовать * контроллер как * форму и что разница в области контроллера – Phil

+0

Спасибо, @Phil, я буду учитывать! Есть ли у вас какие-либо предположения, где я мог бы прочитать больше об этом? Я определенно смущен, и [Документация по контроллеру Angular] (https://docs.angularjs.org/guide/controller) не объясняет это ... и ни у меня источников! Заранее спасибо! – leoxmb

ответ

0

Я не думаю, что это имеет какое-либо отношение к типу mime.

На ваш взгляд, вы также изменили «lstCtrl.customers» на «клиентов»? В противном случае вы указываете на контроллер, на котором ничего нет.

Кстати, у вас было это в первый раз, это лучший подход. Предпочтительно использовать синтаксис controllerAs.

+0

* «Использование синтаксиса controllerAs предпочтительнее» * ~ получил ссылку для этого? – Phil

+1

Нет, не знаю. Я просто работаю с angularJS каждый день в своей дневной работе и следую за новыми угловыми разработками. ControllerAs является относительно новым. Он был добавлен, чтобы восполнить некоторые недостатки в старом способе делать вещи (помещая все в рамки). Простейшей причиной, которую я могу дать, является ControllerAs, позволяющая быть явным, о том, какой контроллер (или область) вы нацеливаете. Если ваш элемент имеет привязку ng-модели к 'fooCtrl.bar', вы вряд ли ссылаетесь на «бар» в неправильной области. Когда вы работаете над большой командой, столкновение данных очень возможно. – HankScorpio

+0

«В противном случае вы указываете на контроллер, на котором ничего нет». Это было ключом к проблеме не отображаемых данных, я думаю ... мим-предупреждение все еще существует, но оно не было связано с проблемой (и я могу жить с ним к настоящему времени)! – leoxmb