用'this'设置属性。主细节视图的表达式

时间:2017-10-26 12:27:55

标签: javascript angularjs

我正在尝试基于JSON文件实现Master-Detail View。 PHP运行良好。它带来了应有的数据。 Config.js或controller.js工作正常。但是,我收到错误,如下所示。 SET属性未定义。

我是初学者。我认为把'this .___'设置属性。但是,似乎我失踪了。如果没有,那可能是什么错? 我从以下链接中获取了参考资料。

有谁能告诉我有什么问题?也许,如何设置属性?

(function () {
    'use strict';
    var app = angular.module('myProject', []);
    app.service('ProjectService', function($http) {
        $http.get("projects_read.php", {})
            .then(function(response){
                var pjts = response.data;
                this.getProjects = function() { //ERROR occurs
                    return pjts;  
                };

                this.getProject = function(id) {
                    for (var i = 0; i < pjts.length; i++) {
                        if (pjts[i].id === id) {
                            return pjts[i];
                        }
                    }
                    return null;
                }

                console.log(pjts);
            });
    })
})();

[ERROR] 无法设置未定义的属性'getProjects'。

[参考链接] http://plnkr.co/edit/VJxlqguJZGrIutAFLCNc?p=preview

提前感谢您的协助!

2 个答案:

答案 0 :(得分:1)

您在错误的上下文(getProjects

上设置属性this

回调function(response){}创建了一个新的上下文(在严格模式下未定义为什么你得到:无法设置属性&#39; getProjects&#39; of undefined)尝试保存服务的引用在承诺之外并使用该背景。

app.service('ProjectService', function($http) {
    var _this = this; //save context of the service
    $http.get("projects_read.php", {})
    .then(function(response){
        var pjts = response.data;

        _this.getProjects = function() {
          return pjts;  
        };

        this.getProject = function(id) {
        for (var i = 0; i < pjts.length; i++) {
            if (pjts[i].id === id) {
            return pjts[i];
            }
        }
        return null;
        }
        console.log(pjts);
    });
  })

答案 1 :(得分:1)

正如卡里姆所指出的,你可以通过使用&#34; var _this = this&#34;

来解决它。

另一种解决方案是绑定它:

(function () {
    'use strict';
    var app = angular.module('myProject', []);
    app.service('ProjectService', function($http) {
        $http.get("projects_read.php", {})
            .then(function(response){
                var pjts = response.data;
                this.getProjects = function() { //ERROR occurs
                    return pjts;  
                };

                this.getProject = function(id) {
                    for (var i = 0; i < pjts.length; i++) {
                        if (pjts[i].id === id) {
                            return pjts[i];
                        }
                    }
                    return null;
                }

                console.log(pjts);
            }.bind(this));
    })
})();