我试图让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