0

まず第一に、私の英語でごめんなさい、私はウクライナ人です

socketio カードの削除イベントを実行すると、ビューに何も変更がありません

私の見解ではng-repeat

<card object="item" ng-repeat="item in LOG"></card>

私のコントローラーで

$scope.LOG = [{...},...{...}];

SocketIO エミット

socket.on('card_was_deleted', function (data) {
    $scope.open_object = undefined;
    $scope.LOG = $scope.LOG.filter(function (obj) {
        return obj.ID != data.id;
    });
});//or var index = ...;$scope.LOG.splice(index, 1);

私は $scope.$apply() ソリューションと安全な適用を探していました (進行中の角度の発生中の例外) が、何も機能しません。

助けてください。

このコードを $apply にラップすると、「inprog」例外が発生します。

MyModule.factory('socket', function ($rootScope) {
var socket = io.connect(...);
var safeApply = function(scope, fn) {
  if (scope.$$phase) {
    fn();
  } else {
    scope.$apply(fn);
  }
};
return {
    on: function (eventName, callback) {
        socket.on(eventName, function () {
            var args = arguments;
            safeApply($rootScope, function () {
                callback.apply(socket, args);
            });
        });
    },
    emit: .../*same code with eventData */
};

});

ngRepeat でカスタムの制限付き要素をプレーンな html に置き換えるとうまくいくことがわかりました。私の指示

    .directive('card', function ($compile, $http, $templateCache) {
        return {
            restrict: 'E',
            replace: true,
            template: '',
            scope: { object: '=',
                collapseClick: '&',
 ...
            },
            link: function (scope, element, attrs) {
                var templateLoader = $http.get("/static/admin-panel/templates/card/card-" + (scope.object.type) + ".html", {cache: $templateCache});
                templateLoader.success(function (html) {
                    element.replaceWith($compile(html)(scope));
                });

            }}
    }
);

どうしたの?

4

1 に答える 1

4

関数を使用して通常の角度フローで実行されない角度関連のコードをラップする必要がある $scope.$applyため、次のようになります。

socket.on('card_was_deleted', function (data) {
  $scope.$apply(function(){
    $scope.open_object = undefined;
    $scope.LOG = $scope.LOG.filter(function (obj) {
       return obj.ID != data.id;
    });
  });
});

内部角度イベント ループをトリガーします。詳細については、こちらを参照してください

于 2013-10-16T09:59:14.260 に答える