AngularJS 工厂对象不会通过控制器自动更新视图
AngularJS factory object is not automatically updating view through controller
所以我有这个问题,我已经挠头几天了,看来我要么找到了真正过时的代码,要么有什么东西坏了,要么我根本不知道我在做什么。
我不能为了我的爱让我的控制器使用我工厂的模型来更新视图。唯一发生的事情是显示默认模型并且永远不会更新。
这是我厂相关部分的总结:
var entryData = {
"postMessage": []
, "setPeerCount": {}
, "nudge": {}
};
ws.onmessage = function(message) {
listener(JSON.parse(message.data));
};
function listener(rpc2) {
console.log(rpc2);
if(rpc2.hasOwnProperty("method") && entryData.hasOwnProperty(rpc2.method)) {
if(type.set[rpc2.method] !== undefined) {
entryData[rpc2.method] = rpc2.params;
}
else if(type.add[rpc2.method] !== undefined) {
entryData[rpc2.method][entryData[rpc2.method].length] = rpc2.params;
};
console.log(entryData)
}
};
return entryData;
我的控制器(socket 是工厂,sockItToMe 是测试应用名称):
sockItToMe.controller('peerCount', ['$scope', 'socket', function($scope, socket){
$scope.peerCount = socket;
}]);
我的看法:
<div ng-controller="peerCount">
{{ peerCount }}
</div>
我在 HTML 中得到的输出:
{"postMessage":[],"setPeerCount":{},"nudge":{}}
我通过直接读取对象从控制台获得的输出:
Object {postMessage: Array[0], setPeerCount: Object, nudge: Object}
nudge: Object__proto__: Object
postMessage: Array[1]0: Object
message: "Welcome"__proto__: Object
length: 1__proto__: Array[0]
setPeerCount: ObjectpeerCount: "3"
the link posted I posted in the comments 的附加信息:虽然您可以只执行 $scope.$apply() 而不是 $rootScope.$apply() 它会在内部调用 $rootScope.$digest() 所以我们不在这里没有任何性能优化。你可以做的是调用 $scope.$digest()。这将在当前范围内执行并仅更新子元素。但是在整个摘要循环再次 运行 之前,父作用域不会得到更新。如果你需要,我认为你必须做 $scope.apply().
[关于 Whosebug:现在是赞成评论更好还是接受答案更好?因为我的答案或多或少只是一个指向正确答案的link。我会把它留给你 ;)]
所以我有这个问题,我已经挠头几天了,看来我要么找到了真正过时的代码,要么有什么东西坏了,要么我根本不知道我在做什么。
我不能为了我的爱让我的控制器使用我工厂的模型来更新视图。唯一发生的事情是显示默认模型并且永远不会更新。
这是我厂相关部分的总结:
var entryData = {
"postMessage": []
, "setPeerCount": {}
, "nudge": {}
};
ws.onmessage = function(message) {
listener(JSON.parse(message.data));
};
function listener(rpc2) {
console.log(rpc2);
if(rpc2.hasOwnProperty("method") && entryData.hasOwnProperty(rpc2.method)) {
if(type.set[rpc2.method] !== undefined) {
entryData[rpc2.method] = rpc2.params;
}
else if(type.add[rpc2.method] !== undefined) {
entryData[rpc2.method][entryData[rpc2.method].length] = rpc2.params;
};
console.log(entryData)
}
};
return entryData;
我的控制器(socket 是工厂,sockItToMe 是测试应用名称):
sockItToMe.controller('peerCount', ['$scope', 'socket', function($scope, socket){
$scope.peerCount = socket;
}]);
我的看法:
<div ng-controller="peerCount">
{{ peerCount }}
</div>
我在 HTML 中得到的输出:
{"postMessage":[],"setPeerCount":{},"nudge":{}}
我通过直接读取对象从控制台获得的输出:
Object {postMessage: Array[0], setPeerCount: Object, nudge: Object}
nudge: Object__proto__: Object
postMessage: Array[1]0: Object
message: "Welcome"__proto__: Object
length: 1__proto__: Array[0]
setPeerCount: ObjectpeerCount: "3"
the link posted I posted in the comments 的附加信息:虽然您可以只执行 $scope.$apply() 而不是 $rootScope.$apply() 它会在内部调用 $rootScope.$digest() 所以我们不在这里没有任何性能优化。你可以做的是调用 $scope.$digest()。这将在当前范围内执行并仅更新子元素。但是在整个摘要循环再次 运行 之前,父作用域不会得到更新。如果你需要,我认为你必须做 $scope.apply().
[关于 Whosebug:现在是赞成评论更好还是接受答案更好?因为我的答案或多或少只是一个指向正确答案的link。我会把它留给你 ;)]