3

サービス/ファクトリの変数に新しい値を割り当てると、バインディングが壊れ、コントローラーが値の更新を停止するようです$scope.verify。サービスオブジェクトをコンソールに出力するだけのコントローラーで関数を呼び出さない限り、バインディングが更新されます一度。skypeClient工場で間違った値を割り当てていますか?

property.changed(function (_status) {
                state = _status;
                console.log("New State" + state);
            });

元。私は and を実行$scope.signIn()し、バインディングを更新しますsigningInが、値が(コンソールで検証された)に変更された場合、それ以降のすべての変更に対して実行しない限りSignedIn、コントローラーは更新されません。SignedIn$scope.verify()skypeClient.state

以下のコードを参照してください。

コントローラ

controller('loginCntrl', function ($scope,skypeClient) {
    $scope.skypeClient = skypeClient;
    $scope.signIn = function () {$scope.skypeClient.signIn($scope.user, $scope.password)}
    $scope.signOut = function(){$scope.skypeClient.signOut()}
    $scope.verify = function () {
        console.log(skypeClient);
        console.log($scope.skypeClient);
    }
});

サービス

.factory('skypeClient', function () {
        //Service Properties
        var client = new Skype.Web.Model.Application;
        var state = 'SignedOut';
        var property = property = client.signInManager.state;
        //Initialize Listeners
        var init = function () {
            client.signInManager.state.when('SignedIn', function () {
                console.log('Signin:' + state); // This outputs the correct value
            });
            property.changed(function (_status) {
                state = _status;                  //<--WHERE VALUE IS UPDATED
                console.log("New State" + state);
            });
           }
        //Signin Function
        var signIn = function (username, password) {
           client.signInManager.signIn({
                username: username,
                password: password
            }).then(function () {console.log('LoggedIn');});
        }
        var signOut = function () {
            client.signInManager.signOut()
            .then(function () {
                this.isSignedIn = false;
            }, function (error) {
                this.erros.push(error);
                this.errorCount++;
            });
        }
        init();
        return {
            signIn: signIn,
            signOut, signOut,
            state: function(){return state}
        }
   });

HTML

(Current Signin State: {{skypeClient.state()}} )
4

1 に答える 1

0

これを試してみましょう。

可能であれば、状態をバインディングに表示する必要があるスコープの変数にするようにしてください。

コントローラ

controller('loginCntrl', function ($scope,skypeClient) {
    ...
    $scope.state = skypeClient.state();
    ...
});

HTML

(Current Signin State: {{ state }} )

これで、コントローラーで、skypeClient から状態変数に $watch を追加できます。私が正しければ、物事はより多くの成功を収めて更新されるはずです。

コントローラー(再び)

controller('loginCntrl', function ($scope,skypeClient) {
    ...
    $scope.state = skypeClient.state();
    ...
    // Add this $watch

    $scope.$watch(skypeClient.state, function (newValue, oldValue) {
        if (newValue !== oldValue) {
            $scope.state = newValue;
        }
    });
});
于 2015-08-17T21:04:46.397 に答える