AngularJs + Pubnub 数据绑定
AngularJs + Pubnub data binding
我使用Pubnub提供的PubNub+AngularJS脚本文件。我有一个控制器可以设置频道并订阅它。我在回调函数中设置了范围变量,我看到范围函数中正在更新的值。问题是这个刚刚更新的范围变量没有反映在 html 页面中。
控制台输出说 pubnub 消息调用了回调方法,我得到了消息。但是由于某种原因,变量数据没有反映到 html。
这是代码:
TitleBarController.js
$scope.ops_tl = new Object();
$scope.ops_tl.data = new Array();
$scope.ops_tl.data.push("dummy");
console.log("pp ", $scope.ops_tl==undefined);
PubNub.ngSubscribe({ channel: channelsToAutoSubscribe[0] });
$rootScope.$on(PubNub.ngMsgEv(channelsToAutoSubscribe[0]), function(event, payload) {
// payload contains message, channel, env...
console.log('got a message event:', payload);
if(payload.channel == channelsToAutoSubscribe[0]) {
// i.e. ops_tl channel
// parse message and populate channel specific variable
console.log($scope.ops_tl.data);
$scope.ops_tl.data.push(payload.message);
console.log($scope.ops_tl.data);
}
else {
console.log("Received message %s from an unknown channel %s", message, channel);
}
});
index.html
<div class="btn-group" ng-controller="TitleBarController">
<button data-toggle="dropdown" class="btn dropdown-toggle">
New users -
<span> {{ ops_tl.data.length }} </span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li ng-repeat="item in ops_tl.data"><a href="#/onboarding/{{ item.data.id }}">New user - {{ item.data.name }}</a></li>
</ul>
</div>
您 运行 遇到了与 angular 中的事件循环处理方式相关的问题。您需要做的是将作用域变量的赋值推迟到事件循环中的新滴答中。最简单的方法是利用 angular.
中的 $timeout 服务
尝试更改此行:
$scope.ops_tl.data.push(payload.message);
为此:
$timeout(function() {
$scope.ops_tl.data.push(payload.message);
});
我使用Pubnub提供的PubNub+AngularJS脚本文件。我有一个控制器可以设置频道并订阅它。我在回调函数中设置了范围变量,我看到范围函数中正在更新的值。问题是这个刚刚更新的范围变量没有反映在 html 页面中。 控制台输出说 pubnub 消息调用了回调方法,我得到了消息。但是由于某种原因,变量数据没有反映到 html。 这是代码:
TitleBarController.js
$scope.ops_tl = new Object();
$scope.ops_tl.data = new Array();
$scope.ops_tl.data.push("dummy");
console.log("pp ", $scope.ops_tl==undefined);
PubNub.ngSubscribe({ channel: channelsToAutoSubscribe[0] });
$rootScope.$on(PubNub.ngMsgEv(channelsToAutoSubscribe[0]), function(event, payload) {
// payload contains message, channel, env...
console.log('got a message event:', payload);
if(payload.channel == channelsToAutoSubscribe[0]) {
// i.e. ops_tl channel
// parse message and populate channel specific variable
console.log($scope.ops_tl.data);
$scope.ops_tl.data.push(payload.message);
console.log($scope.ops_tl.data);
}
else {
console.log("Received message %s from an unknown channel %s", message, channel);
}
});
index.html
<div class="btn-group" ng-controller="TitleBarController">
<button data-toggle="dropdown" class="btn dropdown-toggle">
New users -
<span> {{ ops_tl.data.length }} </span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li ng-repeat="item in ops_tl.data"><a href="#/onboarding/{{ item.data.id }}">New user - {{ item.data.name }}</a></li>
</ul>
</div>
您 运行 遇到了与 angular 中的事件循环处理方式相关的问题。您需要做的是将作用域变量的赋值推迟到事件循环中的新滴答中。最简单的方法是利用 angular.
中的 $timeout 服务尝试更改此行:
$scope.ops_tl.data.push(payload.message);
为此:
$timeout(function() {
$scope.ops_tl.data.push(payload.message);
});