0

サービス データとコントローラ データの間の参照を操作しているときに問題が発生しました

// We have a service that we use to store id and some other data
app.service('testService', function ($http, serverURL) {
    var self = this;
    self.data = {
        id: null,
        token: null,
        ....
    };
    self.initMe = function () {
        return $http({
            method: 'GET',
            url: serverURL + '/initMe/' + '?token=' + self.data.token
        });
    };
    return self;
});
meModule.controller('MeCtrl', function (testService, ...) {
    $scope.me = testService.data; // we make a connection between the scope and the controller

    $rootScope.$on('initMe', function (e, data) {
        testService.initMe().success(function (data, status, headers, config) {
            // typeof(data.result) === 'object'
            // $scope.me = data.result;         // Doesn't work
            // OR
            // testService.data = data.result;    // Doesn't work

            testService.data = data.result; //  
            $scope.me = testService.data;   // It works, but we have to recover
                                            // the references between scope and service
        });
    });
}

質問

  1. $scope.me = data.result または meService.data = data.result; でスコープとサービスの間の接続が失われるのはなぜですか?
  2. 外部 API (Get リクエスト) からサービス内のデータを更新するための他のより良い方法があるでしょうか?
4

2 に答える 2

3

それがJavaScriptの仕組みです。次の例を検討してください。

> first = { data: null }
{ data: null }
> second = { data: first.data }
{ data: null }
> first.data = "something"
'something'
> second.data
null

この行には誤ったアサーションがあります:

$scope.me = testService.data; // we make a connection ...

スコープとサービスの間に実際の接続はありません。単純な値をコピーしているだけです。ただし、オブジェクトへの参照を保存すると、そのオブジェクトをその場で更新でき、「接続」が維持されます。次の例を検討してください。

> first = { data: {} }
{ data: {} }
> second = { data: first.data }
{ data: {} }
> first.data['something'] = 'stuff'
'stuff'
> second.data
{ something: 'stuff' }
于 2013-09-18T06:54:54.623 に答える
0

Service はコンストラクター関数のようなものです。コンストラクター関数で return を実行しません。

接続を失うとはどういう意味かわかりません。ただし、サービスで作成したオブジェクトdataは、サービス内でいつでも再割り当てされるべきではありません。現在、コントローラーのデータを更新しています。サービスでも同じことができます。

また、強調表示した割り当て$scope.me = data.result;により、コントローラーは、サービスが持っているものとは異なるデータのインスタンスを指すようになります。

全体的な問題は、サービスとコントローラーが指す参照にあります。

于 2013-09-18T06:55:08.963 に答える