当前位置: 首页 > 面试题库 >

scope。$ watch在AJAX请求后未调用

宇文金鑫
2023-03-14
问题内容

我有以下指令:

MyApp.directive('myFilter', ['$filter','$rootScope',
function($filter, $rootScope)
{
    var dir = {};
    dir.restrict = 'E';
    dir.templateUrl = 'views/myFilter.html';
    dir.replace = true;
    dir.scope = 
        {
            name: '@',
            model: '=',
        };

    dir.link = function(scope,el,attrs)
    {        
        //stuff here
    }


    return dir; 
}]);

这是我如何调用它:

<my-filter model="someField" name="abcd" />

首次初始化指令时,someField则为空。稍后,通过ajax对其进行检索,并填充其值。

问题是,我怎么看待someField更新的价值?当我从链接方法执行此操作时:

scope.$watch(scope.model, function()
{
   console.log( "changed, new val: ", scope.model );
}

初始化指令时,仅调用一次,然后该值为空。通过ajax(来自$http.get)检索值时,不会再次调用此watch函数。但是,在我要显示的页面的其他部分{{someField}},该值在获取ajax请求时会更新。因此,我认为问题与$scope.apply()在ajax请求之后执行无关。

编辑: someField在控制器中分配。这是代码:

MyApp.controller('myCtrl', 
['$scope', '$rootScope', '$routeParams', 
'ajax', '$filter',

function($scope, $rootScope, $routeParams, ajax, $filter)
{
    var userId = parseInt( $routeParams.userId );        
    $scope.loaded = false;
    $scope.someField = ""; //initalize with empty value

    var load = function(data)
    {
        $scope.loaded = true;
        $scope.someField = data.someField;            
    };

    ajax.getUser(userId).success(load);               
}
]);

该方法ajax.getUser()执行a
$http.get()并返回其promise。在上面的代码中,load调用的方法设置了的值someField


问题答案:

$watch需要一个可以是函数或字符串的表达式。因此,将其更改为

scope.$watch('model', function() { ... });

要么

scope.$watch(function() { return scope.model; }, function() { ... });

看看这个jsFiddle。



 类似资料:
  • 问题内容: 很多时候我们在使用异步javascript时都会遇到问题。我们不确定发布了什么请求以及获得了什么响应。 如何调试AJAX请求。有一个简单的方法可以做到这一点。 问题答案: 我很确定,如果您为每个调用 实例化一个新对象 ,则可以跟踪每个请求:

  • 问题内容: 我不知道如何使用和。官方文档没有帮助。 我不明白的是: 他们连接到DOM吗? 如何更新对模型的DOM更改? 它们之间的连接点是什么? 我尝试了本教程,但这需要对它的理解并且理所当然。 做什么和做什么,以及如何正确使用它们? 问题答案: 您需要了解AngularJS的工作原理才能理解它。 消化周期和作用域 首先,AngularJS定义了所谓的 摘要循环 的概念。这个周期可以看作是一个循环

  • 问题内容: 当应用程序在后台运行并被请求卡住时,数据任务块未调用。 当我打开应用程序时,将调用该块。顺便说一下,我正在使用请求。 这是我的代码: 当应用程序处于活动状态时,可以完美运行。我的代码有什么问题吗?请指出我 问题答案: 如果要在应用程序不再处于前台状态后继续下载,则必须使用后台会话。在后台下载文件中概述了后台会话的基本限制,主要包括: 使用基于委托的背景。 仅使用上传和下载任务,没有完成

  • 问题内容: (做了很多修改,因为它是类的一部分,等等。) 目前,这有点让人讨厌,因为计时器的使用似乎很垃圾。我会使用$ .when和$ .done,但是我不知道可能有多少房间,所以我不知道什么时候放什么。 如何确保仅在所有AJAX请求返回后才调用run_the_rest_of_the_app()? 问题答案: 在进行AJAX调用之前, 完成AJAX调用后(在回调中):

  • 问题内容: 我一直在尝试AngularJS进行实验项目,但我遇到了这个问题。在我的html中,我想显示项目列表 Index.html 最初,我只是使用一个简单的控制器来获取信息并使用以下命令更新视图: controllers.js(原始) 这工作得很好,我可以获得项目清单。同时,通过更改我的结构以使用工厂发出相同的请求并将其绑定到$ scope.items,该命令将不起作用。我尝试了许多$ wat