【问题标题】:Can't seem to reset $scope variable in AngularJS似乎无法在 AngularJS 中重置 $scope 变量
【发布时间】:2015-05-18 17:53:05
【问题描述】:

当 url 参数更改时,我试图在控制器中重置 $scope 变量,但我在保持旧值时遇到了一些问题。

我正在为一家律师事务所建立一个网站,如果我从简历页面本身以外的任何页面点击律师的简历,它就可以正常工作。但是,如果我在已经位于简历页面上时尝试点击新律师的简历页面,它似乎不会重置我的 $scope.thisAttorney 变量,而是创建它的第二个实例。

问题在于我有一个框,里面有关于当前律师的轮换引号,并设置了超时功能。所以,当这个问题发生时,它有两组引号在那个盒子里旋转。当我点击第二位律师的简历时,我需要它来忘记第一位律师。

以下是我认为相关的文件。请问您是否需要查看其他内容。

app.js

var app = angular.module("LKSU", ['ngRoute']);

app.config(function($routeProvider) { 
$routeProvider
    // route for the home page
    .when('/', {
        templateUrl: 'content.php',
        controller: 'HomeController'
    })

    .when('/bios/:user_id?', {   
        controller: 'AttorneyController', 
        templateUrl: 'bio.php'
    })

    .otherwise({
        redirectTo: '/'
    });

});

AttorneyController.js

app.controller('AttorneyController', ['$scope', '$location', 'attorneys', '$sce', '$routeParams', function($scope, $location, attorneys, $sce, $routeParams) {

$scope.myFunctions = {};

var practiceareas = {
    altdispute: "Alternative Dispute Resolution",
    businesscorp: "Businesses & Corporations",
    estateplanning: "Estate Planning",
    futures: "Futures & Derivatives",
    litigation: "Litigation",
    productliability: "Product Liability",
    realestate: "Real Estate",
    securities: "Securities"
};

function quoteflip(quotelist, id, total){
    clearTimeout(timeoutQuotes);    

alert($scope.thisAttorney.name + " 1");  // This is how I know it's holding onto the first attorney in $scope.thisAttorney

    var idno = (id + 1) % total;
    $("#bio_quotes").html(quotelist[id]);
    var src1 = quotelist[idno];

    $("#bio_quotes").fadeOut(500, function(){
        $("#bio_quotes").html(src1).fadeIn(500);
    });

    timeoutQuotes =  window.setTimeout(function(){quoteflip(quotelist, idno, quotelist.length);}, 5000);
    }

var timeoutQuotes = "";

attorneys.success(function(data){
    if($routeParams.user_id > 0){
        var matches = $.grep(data.attorneys, function(obj) { return obj.id == $routeParams.user_id; });

        if (matches.length === 1) {
            $scope.thisAttorney = "";
            $scope.thisAttorney = matches[0];
            $scope.$apply();
            var src = $scope.thisAttorney.quotes[0];
            $("#bio_quotes").html(src).fadeIn(500);

            clearTimeout(timeoutQuotes);

            $scope.attorneys = data.attorneys;
            $scope.practiceareas = practiceareas;
            timeoutQuotes =  window.setTimeout(function(){quoteflip($scope.thisAttorney.quotes, 0, $scope.thisAttorney.quotes.length);}, 5000);
    }

    }else{
        $scope.myFunctions.bio_id = 0;
    };


});


}]);

想法?

作为记录,我尝试将 quoteflip 放在主 script.js 中,但超时调用找不到它,所以我不得不将它带回 Controller。如果有人对此有解决方案,即:看到我的问题,请随时对此发表评论。谢谢。

【问题讨论】:

    标签: angularjs timeout angularjs-scope


    【解决方案1】:

    我建议使用 Angular 的 $timeout 服务文档,可以找到 here

    您只需将其作为附加的控制器依赖项传入:

    app.controller('AttorneyController', ['$scope', '$location', 'attorneys', '$sce', '$routeParams', function($scope, $timeout, $location, attorneys, $sce, $routeParams) { .... }
    

    所以

    window.setTimeout(function(){quoteflip(quotelist, idno, quotelist.length);}, 5000);
    

    变成

    $timeout(function(){quoteflip(quotelist, idno, quotelist.length);}, 5000)
    

    如果您可以提供相关代码,这也会有所帮助。

    【讨论】:

    • 使用 $timeout 并没有改变任何东西,也没有将我的申请行更改为 $scope.$apply("thisAttorney");我会做 Plunk,但每次我尝试时总是搞砸。显然,我不太擅长他们。对不起。 :(
    • 当您“点击第二位律师的简历”时,您是否可以尝试使用 ng-click 设置 $scope.thisAttorney 属性。您可以使用 Chrome 开发人员工具来调试 javascript 吗?如果没有,您可以在 $scope.thisAttorney 设置的代码位中添加另一个警报,以查看此代码是否正在运行。
    • 我会试试点击的东西,看看它是否有效。我知道它是通过警报进入那里的,就像你建议的那样。问题是,在 quoteflip 函数中,当我提醒它时,它会显示一个名称,然后还会提醒另一个名称。这就像我有两个超时,不同的报价和不同的 $scope.thisAttorney。如您所见,我已尝试取消超时,但似乎无济于事。
    • 我去尝试了一下,发现我不知道该怎么做,因为 $scope.thisAttorney 实际上是一个来自 JSON 文件中引入的所有律师的更大对象中的一个对象。设置它是几个步骤的过程。 :(
    • 啊,好吧。我会尝试 Chrome 开发人员工具中的“源”选项卡,并通过控制器和创建 $scope.this Attorney JavaScript 对象的代码进行调试。只需确保一切都按照您的预期进行。您可能需要重新构建方法,以便它们按照您希望的顺序全部触发一次。
    【解决方案2】:

    您是否尝试过使用$timeout 而不是window.setTimeout?您可能需要它,因为您的 $scope 没有被应用到这个非角度异步服务上。

    【讨论】:

      【解决方案3】:

      使用 $timeout。它具有自动 $apply 内置功能,因此您的值将在屏幕上被消化和更新。

      【讨论】:

      • 屏幕上的值已更新。问题是,不知何故,旧的仍然潜伏着,连同它的递归超时调用,在后台造成严重破坏。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多