【发布时间】:2013-07-30 05:36:24
【问题描述】:
我创建了一个指令来监视day 属性并在属性值更改时检索远程资源。 CoffeeScript 代码:
angular.module('app.directives').directive 'myDirective', ['$timeout', ($timeout)->
DirectiveController=($scope, activityResource)->
# Load activities
load= ()->
activityResource.get {
day: $scope.day
environment_id: $scope.environment.id
},
(data)->
$scope.activities = data.activities
# Watch environment and reload activities
$scope.$watch 'environment', (value) ->
load()
# Watch selected day to reload activities
$scope.$watch 'day', (value) ->
load()
...
]
每次day 更改时都会调用load 方法,但不会触发结果回调。网络检查显示请求没有发送到远端。我发现的唯一解决方法是使用$timeout 服务推迟load 方法的执行:
$scope.$watch 'day', (value) ->
$timeout (()-> load()), 10
我怀疑存在与范围生命周期相关的问题,但我无法弄清楚为什么我必须推迟对资源的调用。
更新:
资源源代码:
resources = angular.module('app.resources', ['ngResource'])
...
resources.factory 'app.activityResource', ['$resource', 'app.endpoint', ($resource, endpoint)->
$resource "#{endpoint()}/user/environments/:environment_id/activities/:id/:verb",
{environment_id: "@environment_id", id: "@id"},
latest:
method : 'GET'
params:
verb: 'latest'
annual:
method : 'GET'
params:
verb: 'annual'
]
我还在代码摘录中添加了第二个监视属性 (environment),用作查询资源的参数。
更新 2
我不知道它是否相关,但我们正在使用 CORS 来访问远程端(这似乎运作良好)。
【问题讨论】:
-
是否可以将代码放在 plunkr 或 jsfiddle 中。用于调试代码的更简单的演示。
-
你的activityResource是什么样的?
-
@RishabhSinghal 我试图创建一个 jsFiddle 但到目前为止还没有重现该问题。
-
@DotDotDot 我更新了问题。
-
我尝试使用 $resource 的简化版本重现您的问题,而且它似乎每次都能正常工作并调用它,jsfiddle.net/DotDotDot/qUHGY/4。
标签: angularjs coffeescript angularjs-directive angularjs-scope