gpt4 book ai didi

javascript - AJAX 请求后未调用指令中的 scope.$watch

转载 作者:IT王子 更新时间:2023-10-29 03:09:09 25 4
gpt4 key购买 nike

我有以下指令:

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)检索值时,不会再次调用此监视函数。但是,在我显示 {{someField}} 的页面的其他部分,该值会在获取 ajax 请求时更新。所以我认为问题与在 ajax 请求后执行 $scope.apply() 无关。

编辑 someField 在 Controller 中分配。这是代码:

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() 执行$http.get() 并返回其promise。在上面的代码中,调用了 load 方法来设置 someField 的值。

最佳答案

$watch 需要一个可以是函数或字符串的表达式。所以,如果你把它改成

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

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

查看 this jsFiddle .

关于javascript - AJAX 请求后未调用指令中的 scope.$watch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18139375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com