UI を魔法のように更新するには、$scope のプロパティでいくつかの変更を行う必要があります。たとえば、残りのリソースから一部のユーザーを取得する場合は、次のようにします。
app.controller("UserCtrl", function($http) {
$http.get("users").success(function(data) {
$scope.users = data; // update $scope.users IN the callback
}
)
テンプレートがロードされる前にデータを取得するより良い方法がありますが (routes/ng-view 経由):
app.config(function($routeProvider, userFactory) {
$routeProvider
.when("/users", {
templateUrl: "pages/user.html",
controller: "UserCtrl",
resolve: {
// users will be available on UserCtrl (inject it)
users: userFactory.getUsers() // returns a promise which must be resolved before $routeChangeSuccess
}
}
});
app.factory("userFactory", function($http, $q) {
var factory = {};
factory.getUsers = function() {
var delay = $q.defer(); // promise
$http.get("/users").success(function(data){
delay.resolve(data); // return an array of users as resolved object (parsed from JSON)
}).error(function() {
delay.reject("Unable to fetch users");
});
return delay.promise; // route will not succeed unless resolved
return factory;
});
app.controller("UserCtrl", function($http, users) { // resolved users injected
// nothing else needed, just use users it in your template - your good to go!
)
私は両方の方法を実装しましたが、後者は次の 2 つの理由から非常に望ましいものです。
リソースが解決されるまで、ページは読み込まれません。これにより、$routeChangeStart と $routeChangeSuccess にハンドラーをアタッチすることで、読み込み中のアイコンなどを配置できます。
さらに、ページがロードされるたびにすべてのアイテムがエンターアニメーションを煩わしく再生しないという点で、「エンター」アニメーションでより適切に再生されます(ページが読み込まれるとコールバックで更新されるのではなく、 $scope.users が事前に入力されるため)ロードされています)。