2013-11-28 50 views
0

我有以下的控制器:AngularJS '上' 燒製後控制器視圖中未更新

joolaControllers.controller('dsCtrl', function ($scope, dsService, socket) { 
    dsService.getList(); 
    socket.on('datasources/list:done', function (list) { 
    $scope.list = list.datasources; 
    }); 
}); 

和以下服務:

var joolaServices = angular.module('ngjoola.services', ['ngjoola']); 
joolaServices.service('dsService', function (socket) { 
    this.getList = function() { 
    return joolaio.objects.datasources.list(); 
    }; 
}); 

socket的定義如下(joolaio.io.socket是一個socket.io對象):

ngjoola.factory('socket', function ($rootScope) { 
    var socket = joolaio.io.socket; 
    return { 
    on: function (eventName, callback) { 
     socket.on(eventName, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      callback.apply(socket, args); 
     }); 
     }); 
    }, 
    emit: function (eventName, data, callback) { 
     socket.emit(eventName, data, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      if (callback) { 
      callback.apply(socket, args); 
      } 
     }); 
     }) 
    } 
    }; 
}); 

我的HTML(玉):

.box-content(ng-controller="dsCtrl") 
    | {{list}} 

該列表未顯示。

兩個問題:

  1. 這是我應該如何寫服務/控制器? Angular在這個意義上非常混亂。
  2. 爲什麼{{list}}沒有顯示?
+1

什麼'socket'看起來像?我猜測你正在處理的服務存在內部/外部問題,在某些情況下,'$ apply'是必要的,而在其他情況下,則不是。不能確定沒有看到'套接字'代碼。 –

+0

另外,你當然不希望在你的控制器中偵聽套接字響應。你將想要構造代碼來讀取更多像'$ scope.list = dsService.getList();'或使用promises:'dsService.getList()。then(function(list){$ scope.list = list;} ); –

+0

@BrianGenisio我已經將套接字代碼添加到了我的問題中。我嘗試用''apply''包裝這一行''scope.list = list.datasources;'',但得到一個錯誤消息,說明$ apply已經在進行中了。 –

回答

0

這是一個回調的問題,我在我的代碼更新到下面的,現在可:

控制器:

joolaControllers.controller('dsCtrl', function ($scope, dsService) { 
    dsService.getList(function(list) { 
    $scope.list = list; 
    }); 
}); 

服務:

joolaServices.service('dsService', function (socket) { 
    this.getList = function (callback) { 
    joolaio.objects.datasources.list(function() { 
     socket.on('datasources/list:done', function(list) { 
     callback(list.datasources); 
     }) 
    }); 
    }; 
}); 
相關問題