Назначение значения переменной AngularJS Factory прерывает привязку

Кажется, что когда я присваиваю новое значение переменной в моей службе/фабрике, это прерывает привязку, и контроллер перестает обновлять значение, ЕСЛИ Я не вызываю функцию $scope.verify в моем контроллере, которая просто выводит объект службы на консоль, затем привязка обновляется один раз. Я неправильно присваиваю значение на фабрике skypeClient?

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

Бывший. Я выполняю $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()}} )

person strspl    schedule 17.08.2015    source источник
comment
@Matt, спасибо за правки, я обязательно отформатирую их в будущем.   -  person strspl    schedule 18.08.2015
comment
Без проблем. Это должно быть совместным усилием, и я рад видеть, что вы стремитесь к постоянному совершенствованию.   -  person Matt    schedule 18.08.2015


Ответы (1)


Позвольте мне попробовать это.

Если можете, попробуйте сделать состояние переменной в той области, где оно должно отображаться в привязке.

Контроллер

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

HTML

(Current Signin State: {{ state }} )

Теперь в вашем контроллере вы можете добавить $watch к переменной состояния из файла skypeClient. Если я прав, все должно обновляться с гораздо большим успехом.

Контроллер (снова)

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;
        }
    });
});
person resolute_coder    schedule 17.08.2015
comment
Спасибо за ответ! Однако у меня, кажется, все та же проблема с этим методом, он обновляется один раз, но после этого привязка кажется нарушенной. Если это помогает, часы срабатывают только при первом изменении значения. - person strspl; 18.08.2015
comment
@strspl Добавьте console.log в функцию для $watch. Какие значения newValue и oldValue установлены после первого раза? - person resolute_coder; 18.08.2015