我对角度很合理,我发现以下奇怪的问题发生了,我不确定为什么。我有一个简单的控制器,在范围上有2个属性 - "句子"和" countVal"我在html页面的顶部显示。
我有一个工厂" ModelState"保存我的服务" UpdatingService"填充。
我看到的奇怪问题是ModelState.values.push(data);导致数组长度值变为1,但计数值不会增加。 TestCtrl中的$ watch也不会登录到控制台。我确定我做错了,但我无法弄清楚是什么。这是我的html(内联脚本)。非常感谢提前。
<!doctype>
<html ng-app="testApp">
<head>
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.15/angular.js"></script>
</head>
<body ng-controller="TestCtrl">
<p>Array length : {{ sentences.length }}</p>
<p>Count value : {{ countVal }}</p>
<br>
</body>
<script>
var testApp = angular.module('testApp', []);
testApp.controller('TestCtrl', function($scope, ModelState, UpdatingService) {
$scope.sentences = ModelState.values;
$scope.countVal = ModelState.countVal;
$scope.$watch("countVal", function(newValue, oldValue){
console.log(newValue," ",oldValue);
}, true);
});
testApp.factory('ModelState', function(){
return {
values : [],
countVal : 0
};
});
testApp.service("UpdatingService", function($http, $timeout, ModelState, $q){
var service = {
getData:function(){
var promise = $http.get("http://baconipsum.com/api/?type=meat-and-filler");
promise.success(function(data){
ModelState.values.push(data);
ModelState.countVal++;
});
return promise;
}
};
service.getData();
return service;
});
</script>
</html>
答案 0 :(得分:3)
当您在控制器内写字时:
$scope.sentences = ModelState.values;
$scope.countVal = ModelState.countVal;
您将引用分配给sentences
数组 - 从现在开始ModelState
和$scope
引用同一个Array
<的实例/ p>
并且您将值分配给countVal
属性 - 从现在开始ModelState
和$scope
指向 2个不同的实例Number
然后当您push
新项目sentences
时,其length
更改会反映在视图中,但$scope.countVal
没有更改,因为您只更改了{{ModelState.countVal
的属性1}}。
解决此问题的一种方法是简单地分配$scope.ModelState = ModelState
并直接在视图中使用其属性:
<p>Array length : {{ ModelState.sentences.length }}</p>
<p>Count value : {{ ModelState.countVal }}</p>
另一种方法是使用范围方法来访问ModelState
值,如下所示:
$scope.sentenecesLength = function(){
return ModelState.sentences.length;
};
$scope.countVal = function(){
return ModelState.countVal;
};
<p>Array length : {{ sentenecesLength() }}</p>
<p>Count value : {{ countVal() }}</p>