1

我的问题是,如果不引用 $rootScope 中的消息,我无法弄清楚如何从通道 api 接收消息。这是该服务的一个片段:

myapp.factory('myService', function($http, $rootScope){
var that = this;
var result;
var onOpened = function(){
    console.log("It opened");
}
onMessage = function(message){
    $rootScope.myMessage = JSON.parse(message.data); // this works
    $rootScope.$apply();                             // but I don't wanna use it
}

var channel = new goog.appengine.Channel('{{ token }}'); // yes, I'm mixing frameworks, relax...
var socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;


// I should be returning the onMessage result here, and somehow watching it
})

我不知道如何在不调用 rootscope 的情况下将 onMessage 函数的结果返回给控制器。

控制器很简单:

myapp.controller('cntrl1', function($scope, $rootScope, myService){
  // It seems that a watch would work but I can't figure out how to 
    // get the 'return' of the service wired to allow this method to be successful.
    // Remember, the onMessage is a json message sent from another client through the 
    // server.  

    $scope.message = $rootScope.myMessage // not necessary

$scope.$watch('myService.parsed', function(newVal, oldVal, scope){      
    if(newVal){
        console.log("changed");
        scope.message = newVal.data;
    } else {
        console.log(oldVal);
        scope.message = oldVal;
    }
})
})

我知道每次全局命名空间被污染时,一只小狗就会死去,但在这种情况下,我可能不得不牺牲一只小狗。我被困住了。

4

2 回答 2

4

因此,经过更多阅读,我发现 $broadcast 和 $on 是解决方案。(我一直忙于查找 $watch 的示例,以至于没有意识到最简单的答案一直都在这里。)

在服务/工厂:

myapp.factory('myService', function($http, $rootScope){
var cleanMessage;
var onOpened = function(){
    console.log("BOO");
}
onMessage = function(message){      
    cleanMessage = JSON.parse(message.data);
    $rootScope.$broadcast('newMessage', cleanMessage);
    $rootScope.$apply();        
}

var channel = new goog.appengine.Channel('{{ token }}');
var socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;   
})  

$broadcast 对所有子作用域说,在“newMessage”的情况下,模型已经改变,所以准备好更新......

在控制器中是 $on 方法:

myapp.controller('cntrl1', function($scope, $rootScope, myService){
$scope.$on('newMessage', function(evt, message){

    $scope.message = message.data;
})  
})
于 2013-05-18T04:48:53.253 回答
1

为什么不使用观察者模式并创建一个myService可以从控制器订阅消息的方法?然后你可以简单地做:

myapp.controller('cntrl1', function($scope, $rootScope, myService) {
    myService.subscribe(function (newMessage) {
        $scope.myMessage = newMessage;
    });
}

subscribe,由 返回myService,只会将回调函数存储在一个数组中,并且任何时候onMessage被触发,它都会遍历数组并使用新消息调用每个回调。

于 2013-05-18T04:37:04.167 回答