【问题标题】:AngularJs interval only shows {{name}}AngularJs 间隔只显示 {{name}}
【发布时间】:2016-09-08 08:39:54
【问题描述】:

我试图通过每 5 秒调用一次 AngularJS 获取函数来获取我的 django 应用程序中所有“现金流”对象的列表。我使用 $interval(getCashflows, 5000); 运行该函数在我的 js 文件中并尝试在我的 html 中将其显示为 [[getCashflows]](请参阅 interpolateprovider)

现在我唯一得到的是我的 html 中的“[[getCashflows]]”。interpolateProvider 不起作用还是我需要以不同的方式调用它?

 app = angular.module("coco",[]);

app.config(function($interpolateProvider) {
    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');
});

app.controller('cocoCtrl',['$scope','$http', function($scope) {

    $scope.save = function (cashflow) {
        var dataObj = {
                value : cashflow.value,
                date : cashflow.date,
        };
        $.ajax({
            url : "/create_cashflow/", // view functie
            type : "POST",
            data : dataObj,
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
            },
            success : function(json) {
                $(".data").prepend("<li><strong>"+json.value+"</strong> - <em> "+json.date+"</em></li>");

            }
        });
    }

}]);

app.controller('cocogetCtrl',['$scope','$http', function($scope,$http, $interval) {

    $scope.cashflows = "";
    $interval($scope.getCashflows = function() {
        return $http.get("/get_cashflows/", {data:data}).then(function(response) {
            $scope.cashflows = "test";
            alert(response.toString());
            $(".flows").prepend("<li><strong>"+json.value+"</strong> - <em> "+json.date+"</em></li>");
            return response.toString();

        });
    }, 5000);
}]);

【问题讨论】:

    标签: javascript angularjs django


    【解决方案1】:

    您的问题几乎可以肯定是您试图从 jQuery 回调中更新角度范围变量。 Angular 仅在其自己的摘要循环内检查范围的更改,并且回调将在该上下文之外发生,因此 Angular 看不到更改。

    简单的解决方法是停止使用$.ajax() 调用并开始使用您已经包含在控制器中的$http 服务。

    但是,您希望在 html 中看到什么并不清楚。函数getCashflows 没有返回一个值,无论是书面的还是如果你重写它以使用$http。该值是从服务器异步检索的。您应该更改它,以便范围值是一个可以解析为预期值的承诺。由于$http 已经返回了一个承诺,因此执行以下操作就足够了:

    function getCashflows() {
       $scope.cashFlows = $http.get("/get_cashflows/", {data:data})
       .then(function(response) {
           return response.data;
       });
    }
    

    更改您的 html 以插入值 cashFlows 而不是函数。

    getCashflows 本身可能没有任何理由暴露在作用域中,您可以将其设置为普通函数,该函数将具有修复对 $interval 的调用的副作用,当前只会导致 javascript由于未解析的名称而停止。

    【讨论】:

    • 谢谢你的解释。我可以留下我的“$interval(getCashflows, 5000);”吗?就这样?
    • 是的,如果您将其更改为函数,$interval 调用应该可以正常工作。
    • 我更新了我的代码(原 Q)。当我现在使用间隔函数测试代码时,我的发布请求不再起作用..可能是因为间隔中断了那个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2014-04-27
    • 2014-03-20
    • 2014-11-07
    相关资源
    最近更新 更多