2014-06-19 2 views
1

AngularJs로 첫 번째 애플리케이션을 만들려고합니다. Tizen OS 용으로 제작하고 있으며 Jquery 모바일도 사용하고 있지만이 경우에는 별 문제가되지 않습니다.비동기 범위가있는 각도 js 컨트롤러, websql

영구 저장소로 WebSql을 선택했습니다. 각형 모듈로 멋진 래퍼를 발견했습니다 - angular-websql. 나는 간단한 앵귤러 콘트롤러의 작동 방식을 다소 알았지 만,이 모든 WebSql 항목은 비동기식이며, 실제로 상황이 실제로 복잡하게됩니다.

나는 접근법을 가지고 나왔지만, 그것이 "각도 방식"인지 확실하지 않습니다. 이 코드에서 오면

app = angular.module('foo', ["angular-websql"]) 
.factory('User', function ($webSql) { 
    db = $webSql.openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
    db.createTable('users', { 
     // table schema 
    }); 

    User = {}; 
    User.insert = function(elem, callback) { 
     db.insert('expenses', elem, callback); 
    } 
    User.selectAll = function(handler, callback){ 
     db.selectAll('expenses', function(results) { 
      for(var i=0; i < results.rows.length; i++) { 
      handler(results.rows.item(i)); 
      } 
      callback(); 
     }); 
    } 
    return User; 
}) 

.controller('BarCtrl', function ($scope, User) { 
    $scope.add = function() { 
     User.insert({ 
     name: $scope.name, 
     lastname: $scope.lastname 
     //and so on 
     }, UpdateUsers) 
    } 

    function UpdateUsers() { 
     $scope.users = [] 
     Foo.selectAll(function(elem) {$scope.users.push(elem)}, $scope.$apply}); 
    } 
}); 

, 내가 수동으로 (즉, 작업이 비동기로) 레코드가 데이터베이스에 추가되면 expense 바인딩 업데이트해야합니다. 나도 $scope.$apply에 전화해야합니다. 그것을 피할 수있는 방법이 있습니까? 각도 약속을 사용할 수있는 방법이 있습니까? 아마도 상황이 나아질 수 있습니까? 이 코드를 개선 할 수 있다고 생각하지만 어떤 방향인지는 확실하지 않습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

저는 (IMHO) 당신이 websql을 서비스 공장으로 포장해야한다고 말하고 싶습니다. 서비스에서 반환 된 객체 목록을 작성하고 약속을 사용하는 것이 좋은 일임에 동의합니다. 각도 바인딩 외부에서 상호 작용할 때는 scope.apply를 수행해야하지만 서비스에서이를 수행해야합니다. 각도에 물건 같은 콜백이 있지만, 귀하의 각도 코드 에서이 구조를 도입하는 것을 삼가 할 것입니다. 그것은 훨씬 더 읽기 쉬울 것입니다.

나를 위해, 나는 순수한 시도하고 컨트롤러 코드에서 모든 타사 라이브러리를 숨기고 귀하의 서비스와 지침에 보관하는 것이 좋습니다. 이렇게하면 NG 방식으로 코드를 작성하고 단위 테스트를 훨씬 쉽게 할 수 있습니다. 또한 이미 정의 된 계약을 위반하지 않고 새 라이브러리를 스왑 할 수 있습니다.

의미가 있습니까?