gpt4 book ai didi

javascript - AngularJS 中的 View 未更新

转载 作者:IT王子 更新时间:2023-10-29 02:55:37 25 4
gpt4 key购买 nike

在事件回调中更新模型时更新模型属性对 View 没有影响,有什么办法解决这个问题吗?

这是我的服务:

angular.service('Channel', function() {        
var channel = null;

return {
init: function(channelId, clientId) {
var that = this;

channel = new goog.appengine.Channel(channelId);
var socket = channel.open();

socket.onmessage = function(msg) {
var args = eval(msg.data);
that.publish(args[0], args[1]);
};
}
};
});

publish() 函数是在 Controller 中动态添加的。

Controller :

App.Controllers.ParticipantsController = function($xhr, $channel) {
var self = this;

self.participants = [];

// here publish function is added to service
mediator.installTo($channel);

// subscribe was also added with publish
$channel.subscribe('+p', function(name) {
self.add(name);
});

self.add = function(name) {
self.participants.push({ name: name });
}
};

App.Controllers.ParticipantsController.$inject = ['$xhr', 'Channel'];

查看:

<div ng:controller="App.Controllers.ParticipantsController">      
<ul>
<li ng:repeat="participant in participants"><label ng:bind="participant.name"></label></li>
</ul>

<button ng:click="add('test')">add</button>
</div>

所以问题是单击按钮会正确更新 View ,但是当我从 Channel 收到消息时什么也没有发生,甚至 add() 函数也会被调用

最佳答案

您缺少 $scope.$apply()

每当你从 Angular 世界之外接触任何东西时,你需要调用 $apply 来通知 Angular。这可能来自:

  • xhr 回调(由 $http 服务处理)
  • setTimeout 回调(由 $defer 服务处理)
  • DOM 事件回调(由指令处理)

在你的情况下,做这样的事情:

// inject $rootScope and do $apply on it
angular.service('Channel', function($rootScope) {
// ...
return {
init: function(channelId, clientId) {
// ...
socket.onmessage = function(msg) {
$rootScope.$apply(function() {
that.publish(args[0], args[1]);
});
};
}
};
});

关于javascript - AngularJS 中的 View 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10179488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com