我試圖讓Thing工廠發出HTTP請求,並能夠在我的控制器中使用響應。爲什麼我需要在我的工廠使用angular.copy?
在我的工廠我必須做
angular.copy(data, arr)
。只是做arr = data
不起作用。爲什麼是這樣?angular.copy()
只是a)刪除arr
中的所有內容,b)通過data
進行迭代並將內容分配給arr
。與arr = data
唯一的區別是arr
指向data
而不是data
的新副本。爲什麼會這樣?爲什麼不arr = data.slice(0)
工作(從我個人理解,這幾乎是一樣的angular.copy)
?什麼是實現我的目標的最好方法是什麼?(使用工廠正常)
main.html中
<div class="container">
<div class="page-header">
<h1>Test App</h1>
</div>
<ul>
<li ng-repeat="thing in things">{{thing.name}}</li>
</ul>
</div>
main.controller.js
'use strict';
angular.module('testApp')
.factory('Thing', function($http) {
var arr = [];
return {
things: arr,
get: function() {
$http.get('/api/things').success(function(data) {
angular.copy(data, arr); // this works
// arr = data; but this doesn't
// arr = data.slice(0); and neither does this
});
}
};
})
.controller('MainCtrl', function ($scope, Thing) {
Thing.get();
$scope.things = Thing.things;
});
angular.copy適用於對象或數組,數據是一個對象嗎?順便說一句,你應該利用提升和提取你的匿名函數到命名函數中,並簡單地將函數名稱傳遞給工廠和控制器方法。使得更容易找出模塊的組件。 – Robert 2015-02-07 05:35:59
'data'是一個對象數組。 – 2015-02-07 05:41:36
它可以工作,因爲arr(數組)是一個引用,並且您需要保留引用才能使範圍綁定起作用。否則,你只是用一個新的引用覆蓋arr--這是與最初綁定到作用域的引用完全不同的對象。 – pixelbits 2015-02-07 05:49:14