0

私はかなり単純な 2 ページの Web アプリを持っています。Angular と Lawnchair を使用します。ユーザーが認証され、関連データが取得されるまで、画面/ビューを変更したくないログインページがあります。さらに、これはモバイルアプリです。そのため、ユーザーを再認証し、ブラウザからデータをロードするだけで済みます。

<!DOCTYPE html>
<html xmlns:ng="http://angularjs.org" ng:app="AppMod">
<head>
...
</head>
<body ng:controller="AppCtrl">
    <ng:view></ng:view>
    ...
</body>
</html>

アダプターなしで Lawnchair を使用すると、Angular はビューを正常に変更し、Lawnchair はデータをブラウザーに保存しますが、WebSQL や IndexedDB のような永続的なものには保存しません。ただし、1 つ以上の Lawnchair アダプターが含まれるとすぐに、最悪の場合はビューが表示されないか、せいぜいビューを変更せずに場所/URI を更新します ('change' などの別のイベントが発行されるまで)。

$scope['login'] = function()
{
    AuthSvc.query(
        {'username':$scope['username'], 'password':$scope['password']},
        function( results )
        {
            LastUsedRsc.save({'key':'credentials', 'value':
                {'username':$scope['username'], 'password':$scope['password']}});
            $location.path( '/dataset' );
        },
        function( error )
        {
            alert( "Incorrect username and/or password." );
        });
    return( false );
};

$scope.$apply()、$scope.$digest()、それぞれの「安全な」ラッパーなどを試しました。レビュー用のJSFiddleを次に示します。Manage Resources の下にある Lawnchair アダプターを削除し、もう一度フィドルを実行すると、ビューが機能し始めることがわかりますが、Lawnchair は真に永続化されていないため価値がありません。Lawnchair のアダプターの 1 つを使用しているときに、ビューを変更するには何が必要ですか?

4

1 に答える 1

1

との約束を解決した後に、$digestまたはを実行する必要があります。$applyLoginResolverDatasetResolver

例:

var LoginResolver = {
    'credentialsAsync':function( $rootScope, $q, $route, LastUsedRsc ) {
        var deferred = $q.defer();
        LastUsedRsc.get( 'credentials', function( object ) {
            deferred.resolve( object );
            $rootScope.$digest();
        },
        function( error ) {
            window.console.info( "Using default, default value.", error );            
            deferred.resolve({'value':{}});      
            $rootScope.$digest();
        });
    return( deferred.promise );
    },
};

注:解決/拒否後に注入$rootScopeして呼び出す必要があります。$digest

于 2013-01-31T02:26:01.320 に答える