2015-11-17 5 views
4

Я использую услугу Angular $resource, и для меня непонятно, почему существуют два разных метода для основных запросов.

Я могу это сделать:

var House = $resource('/house/:uuid', {}); // create resource 
var houseUuid = '123'; 
var house = new House.get({uuid: houseUuid}); // create resource instance 

... а потом в мой контроллер:

$scope.house = house; // after get request to server data will be putted to model 

НО

Существует странный $get метод экземпляра ресурса

house.$get(...) // what is $get? 

В чем разница? Как я могу их использовать? Какова основная информация о методе $get?

ответ

4

В 5 общие методы get, save, query, remove и delete доступны в $resource класса, который может быть вызван непосредственно над House класса.

Хотя save, remove и delete методы могут быть доступны с $ префиксом на экземпляре класса House/ресурс, который позволяет нам легко выполнить операцию CRUD на любом экземпляре.

Сравните это с Java методом т.е. все 5 способов без $ статические методы в Java в то время как все 3 (save, remove и delete) с $ префиксом являются метод уровня экземпляра.

Рассмотрим пример:

// Define a class/resource 
var House = $resource('/house/:uuid', {}); 

// Get an instance 
var houseInstance = Hourse.get({uuid: "xyz"}); 

// Delete the instance on any event like click using the `$` prefix (which works directly on the instance) 
houseInstance.$delete() 

// Or delete that instance using the class: 
House.delete({uuid: houseInstance.uuid}); 

Аналогично для других методов, таких как save и remove. Я не уверен, будет ли доступен метод $get, потому что это действительно не нужно. Если вы думаете в архитектуре MVC, зачем вам нужен метод экземпляра для получения одной записи над экземпляром.

Кроме того, вы можете определить свой собственный экземпляр и (статические) методы уровня класса:

var House = $resource('/house/:uuid', {}, { 
    foo: { 
     method: "POST", 
     url: "/house/show/:uuid" 
    }, 
    update: { 
     method: "PUT" 
    } 
}); 

Теперь вы можете позвонить:

House.foo({uuid: "xyz"}, {houseNumber: "1234"}); 

// Or you can write this: 

var house = new House(); 
house.uuid = "xyz"; 
house.houseNumber = "1234"; 
house.$foo(); 
// Or any custom method 
house.$update(); 

Вы можете использовать любой из подход т (класс или действие уровня экземпляра), но я рекомендую использовать уровень экземпляра (то есть с префиксом $), где у вас есть несколько экземпляров House (или любой ресурс), как на странице списка домов.

Итак, если вы повторяете сотни экземпляров House, вы можете легко предоставить возможность удалить House, если вы используете действие экземпляра.Например:

Использование действия экземпляра (рекомендованное в данном примере):

<div ng-repeat="house in houses"> 
    {{house.name}} 
    <a href="house.$delete()">Delete this house</a> 
</div> 

Но вы также можете использовать действия на уровне класса в этом случае (что не рекомендуется в данном примере)

Использование класса действия (не рекомендуется в данном примере):

<div ng-repeat="house in houses"> 
    {{house.name}} 
    <a href="deleteHouse(house.uuid)">Delete this house</a> 
</div> 

В контроллере:

$scope.deleteHouse = function(uuid) { 
    House.delete({uuid: uuid}); 
}; 

Это просто обычный простой пример, который демонстрирует потребительной случай, когда использовать ветеринарный врач действий экземпляра и ясно сказано, что использование экземпляра в приведенном выше примере будет более чистым.