2013-05-05 27 views
9

Tôi là người mới phát triển và tôi đã viết ứng dụng đơn giản này, nhưng không hiểu cách tôi có thể cập nhật chế độ xem, sau khi mô hình được tải từ yêu cầu ajax khi khởi động!Cập nhật AngularJS Xem sau khi Mô hình được tải từ Ajax

Mã này không hoạt động khi tôi thêm độ trễ vào photos.php, sử dụng: ngủ (3); để mô phỏng trễ máy chủ từ xa! thay vào đó nếu search.php nhanh thì nó hoạt động !!

<!doctype html> 
<html ng-app="photoApp"> 
<head> 
<title>Photo Gallery</title> 
</head> 
<body> 
    <div ng-view></div> 

<script src="../angular.min.js"></script> 
<script> 
'use strict'; 

var photos = []; //model 

var photoAppModule = angular.module('photoApp', []); 

photoAppModule.config(function($routeProvider) { 
    $routeProvider.when('/photos', { 
         templateUrl: 'photo-list.html', 
         controller: 'listCtrl' }); 
    $routeProvider.otherwise({redirectTo: '/photos'}); 
}) 
.run(function($http) { 
    $http.get('photos.php')//load model with delay 
    .success(function(json) { 

     photos = json; ///THE PROBLEM HERE!! if photos.php is slow DON'T update the view! 

    }); 
}) 
.controller('listCtrl', function($scope) { 

    $scope.photos = photos; 

}); 
</script> 
</body> 
</html> 

sản lượng photos.php

[{"file": "cat.jpg", "description": "my cat in my house"}, 
{"file": "house.jpg", "description": "my house"}, 
{"file": "sky.jpg", "description": "sky over my house"}] 

ảnh list.html

<ul> 
    <li ng-repeat="photo in photos "> 
    <a href="#/photos/{{ $index }}"> 
     <img ng-src="images/thumb/{{photo.file}}" alt="{{photo.description}}" /> 
    </a> 
    </li> 
</ul> 

EDIT 1, Hoãn giải pháp:

.run(function($http, $q) { 

    var deferred = $q.defer(); 

    $http.get('photos.php')//load model with delay 
    .success(function(json) { 
     console.log(json); 

     photos = json; ///THE PROBLEM!! if photos.php is slow DON'T update the view! 

     deferred.resolve(json);//THE SOLUTION! 
    }); 

    photos = deferred.promise; 
}) 

EDIT 2, giải pháp dịch vụ:

... 
//require angular-resource.min.js 
angular.module('photoApp.service', ['ngResource']).factory('photoList', function($resource) { 
    var Res = $resource('photos.php', {}, 
     { 
      query: {method:'GET', params:{}, isArray:true} 
     }); 
    return Res; 
}); 

var photoAppModule = angular.module('photoApp', ['photoApp.service']); 

... 

.run(function($http, photoList) { 

    photos = photoList.query(); 
}) 
... 

Trả lời

0

Bạn cần phải ràng buộc một yếu tố trong quan điểm của bạn đến một bất động sản (đối tượng đơn giản hoặc) của đối tượng $scope của bạn. Khi đối tượng phạm vi $ được cập nhật, chế độ xem phải được cập nhật riêng. Đó là vẻ đẹp của AngularJS.

EDIT: Vui lòng đăng ký điều khiển của bạn như

photoAppModule.controller('listCtrl', function($scope){ 
    $scope.photos = photos; 

}); 

Nếu ảnh biến không có sẵn, sau đó bạn có thể phải tạo ra một dịch vụ với các biến và tiêm trong bộ điều khiển.

+0

Tôi đã thêm chế độ xem .. xem chỉnh sửa của tôi. Tôi chỉ liên kết $ scope.photos = ảnh; Nhưng nếu tôi chỉnh sửa ảnh ... chế độ xem không thay đổi – StefanoCudini

+0

Tôi nghi ngờ rằng bạn không đăng ký bộ điều khiển với Angular. photoAppModule.controller ('listCtrl', function ($ scope) {}); thay vì chỉ là một chức năng thông thường. Điều đó có thể hiệu quả. – Ketan

+0

có lẽ :) nhưng tôi không hiểu cách đăng ký bộ điều khiển – StefanoCudini

1

Tôi nghĩ rằng bạn nên sử dụng dịch vụ góc độ cao để truyền dữ liệu, cũng nhìn vào những lời hứa và dịch vụ:

http://docs.angularjs.org/api/ng.$q

+0

tnk! xem chỉnh sửa của tôi xin vui lòng 'giải pháp đầu tiên' Bạn nghĩ sao? – StefanoCudini

+0

có vẻ ổn, nó có hoạt động trong trường hợp của bạn không? –

+0

có công việc, nhưng tôi không biết nếu đó là giải pháp tốt nhất thường được sử dụng trong angularjs. hãy xem EDIT 2 của tôi, là giải pháp thứ hai sử dụng dịch vụ, tôi chỉ muốn biết liệu dịch vụ có được xác định rõ trong chế độ này hay không. bạn nghĩ điều gì là thanh lịch nhất trong cả hai? cảm ơn! – StefanoCudini

4

sử dụng phát sóng

//service 
var mydata = []; 
this.update = function(){ 
    $http.get(url).success(function(data){ 
    mydata = data; 
    broadcastMe(); 
    }); 
}; 
this.broadcastMe = function(){ 
    $rootScope.$broadcast('mybroadcast'); 
}; 

//controller 
$scope.$on('mybroadcast', function(){ 
    $scope.mydata = service.mydata; 
}; 

http://bresleveloper.blogspot.co.il/

EDIT: vài ngày trước tôi đã học được cách thực hành tốt nhất http://bresleveloper.blogspot.co.il/2013/08/breslevelopers-angularjs-tutorial.html

6

Câu trả lời ngắn gọn là thế này:

.controller('listCtrl', ['$scope', '$timeout', function($scope, $timeout) { 
    $timeout(function() { 
     $scope.photos = photos; 
    }, 0); 
}]); 

Câu trả lời dài là: Xin đừng trộn thường xuyên javascript và góc cạnh như thế này. Viết lại mã của bạn để góc nhìn biết những gì đang xảy ra ở tất cả các lần.

var photoAppModule = angular.module('photoApp', []); 

photoAppModule.config(function($routeProvider) { 
    $routeProvider.when('/photos', { 
     templateUrl: 'photo-list.html', 
     controller: 'listCtrl' 
    }); 

    $routeProvider.otherwise({redirectTo: '/photos'}); 
}); 

photoAppModule.controller('listCtrl', ['$scope', function($scope) { 
    $scope.photos = {}; 

    $http.get('photos.php') // load model with delay 
     .success(function(json) { 
      $scope.photos = json; // No more problems 
     }); 
}]); 
Các vấn đề liên quan