Angular和PhoneGap事件队列

时间:2014-12-31 19:44:39

标签: javascript angularjs cordova

我有这个:

app.factory('contacts', function ($rootScope, $q, cordovaReady) {
    return {
        find: cordovaReady(function (filter) {
            var deferred = $q.defer();

            var options = new ContactFindOptions();
            options.filter = filter;
            options.multiple = true;
            var fields = ["displayName", "name", "addresses", "emails"];
            navigator.contacts.find(fields, function (contacts) {
                $rootScope.$apply(function () {
                    deferred.resolve(contacts);
                });

            }, function (error) {
                $rootScope.$apply(function () {
                    deferred.reject(error);
                });
            }, options);

            return deferred.promise;
        })
    };

app.factory('cordovaReady', function () {
    return function (fn) {

        var queue = [];

        var impl = function () {
            queue.push(Array.prototype.slice.call(arguments));
        };

        document.addEventListener('deviceready', function () {
            queue.forEach(function (args) {
                fn.apply(this, args);
            });
            impl = fn;
        }, false);

        return function () {
            return impl.apply(this, arguments);
        };
    };
});

每当我从控制器打电话时:

var contactSearch = '';
contacts.find(contactSearch).then(function (contacts) {
    $scope.contacts = contacts;
}, function (error) {
    console.log(error);
});

我明白了:

ReferenceError: ContactFindOptions is not defined
    at Object.<anonymous> 

我确保用cordovaReady包装该函数。为什么会这样?

1 个答案:

答案 0 :(得分:1)

你能否回答这个问题 -     Uncaught ReferenceError: ContactFindOptions is not defined

还要确保你的app.js应该在index.html中的cordova.js或phonegap JS之后包含。

我还建议使用ng-cordova包装器作为联系插件。

  1. 在你的js索引文件之前包含ng-cordova.js。
  2. 将ngCordova注入您的应用模块。
  3. 将$ cordovaContacts注入您的服务/工厂。
  4. 更多访问http://ngcordova.com/

    实施例

     var services = angular.module("services", ['ngCordova']);
        services.service('contact', contact);
        function contact($cordovaContacts, $q) {
            return {
                find : function() {
                    var deferred = $q.defer();
                    var options = {};
                    options.filter = "";
                    options.multiple = true;
                    $cordovaContacts.find(options).then(function(contacts) {
                        for (var i = 0; i < contacts.length; i++) {
                            if (null != contacts[i].phoneNumbers) {
                                for (var j = 0; j < contacts[i].phoneNumbers.length; j++) {
    
                                    alert(contacts[i].phoneNumbers[j].value);
                                    if (null != contacts[i].emails) {
                                        alert(contacts[i].emails[0].value);
                                    } 
                                    alert(contacts[i].displayName);
                                }
                            }
                            deferred.resolve();
                        }, function(err) {
                    deferred.reject();
                    alert("error in contact find");
                });
                return deferred.promise;
              };
        };
    

    希望这个答案可以帮到你。