AngularJS:undefined不是工厂的功能

时间:2015-01-22 16:38:20

标签: javascript angularjs angularjs-factory

我的工厂内部有多个功能,我无法通过单击按钮来调用我的saveCharacter功能。 getCharacters函数工作得很好。对不起提前转发,我已经找到了许多不同的例子,无法解决我的特殊问题。我在登录xmlService时可以看到我的功能,但我不确定为什么它不会调用它。我试图在saveCharacter中将帖子返回到PHP文件,但更改为字符串返回以尝试测试以查看我的问题。

再次感谢您的帮助。

(function(){

var app = angular.module('arena', []);

app.factory('xmlService', function($http){

    var factory = {};

    factory.getCharacter = function getCharacter(){         
        return $http.get('xml/characterTemplate.xml');
    };
    factory.saveCharacter = function saveCharacter(){
        return "hello";
        //return $http.post('php/crud.php');
    };

    return factory;

});

app.controller('FighterController', ['$scope','xmlService', function($scope, xmlService){
    this.fighterList = fighterList;


    $scope.saveFighter = function saveFighter(){
        console.log(xmlService);
        xmlService.saveCharacter.success(function(data){
            console.log(data);
        });
    }

    function loadFighters(){


        xmlService.getCharacter().success(function(data){
            var x2js = new X2JS(); 
            var charactersList  = x2js.xml_str2json(data);

            for(var i = 0; i < charactersList.characters.character.length; i++)
            {
                var currentFighter = charactersList.characters.character[i];
                fighterList.push(currentFighter);

            }                
            $scope.FighterController = charactersList;
        });
    }
    loadFighters();
}]);



var fighterList = [
];

})();

我在编写第一个Angular应用程序时遇到的其他问题,代码的重点是什么:

$scope.FighterController = charactersList;

是否允许我在视图端访问返回的数据?我是否必须重置saveFighter功能中的范围才能使我的按钮工作?

我是否正确为app.controller设置依赖项,是依赖注入吗?

谢谢大家,非常感谢您对我的代码设置的任何评论!

3 个答案:

答案 0 :(得分:3)

你还没有解释你为解决这个问题所采取的措施,所以我会解释一下。

在这里,您正试图致电xmlService.saveCharacter.success()

xmlService.saveCharacter.success(function(data){
        console.log(data);
});

但是xmlService.saveCharacter是一个功能。它没有success属性; success未定义。所以这给出了你看到的错误。

您需要致电 xmlService.saveCharacter()

xmlService.saveCharacter().success(function(data){
        console.log(data);
});

但这仍然是个问题,因为saveCharacter()函数返回字符串"hello"。此字符串没有success属性。 success再次undefined,现在导致同样的错误。

要解决该错误,您只需删除return "hello";并取消注释已注释掉的代码:

factory.saveCharacter = function saveCharacter(){
    return $http.post('php/crud.php');
};

解决这两个问题应该可以解决您的问题。

答案 1 :(得分:0)

您缺少调用()更改代码的函数:

$scope.saveFighter = function saveFighter(){
    console.log(xmlService);

    xmlService.saveCharacter().success(function(data){
    // ----------------------^
        console.log(data);
    });
 }

$scope.FighterController = charactersList;将characterList的数据分配给范围变量,范围变量可在html范围内访问,就像控制器和视图之间的桥梁一样。

我建议您start reading angularjs

答案 2 :(得分:0)

我将工厂调整到这个结构,现在我可以调用我的功能了。

app.factory('xmlService', function($http){

    var factory = {
        getCharacter: function(){
            return $http.get('xml/characterTemplate.xml');
        },
        saveCharacter:function(){
            console.log('hello?');
            return $http.post('php/crud.php');
        }
    };
    return factory;

}); 

在我的控制器中

$scope.saveFighter = function(){
        console.log(xmlService);
        xmlService.saveCharacter().success(function(data){
            console.log(data);
        });

    }

    function loadFighters(){
        xmlService.getCharacter().success(function(data){
            var x2js = new X2JS(); 
            var charactersList  = x2js.xml_str2json(data);

            for(var i = 0; i < charactersList.characters.character.length; i++)
            {
                var currentFighter = charactersList.characters.character[i];
                fighterList.push(currentFighter);

            }                
            $scope.FighterController = charactersList;
        });
    }
    loadFighters();