如何将指令模型绑定到异步服务数据
How to bind directive model to async service data
我正在尝试做简单的事情 - 将指令的模型绑定到服务的数据。在服务的数据异步加载(通过$timeout或$http请求)之前,它根本不会更新指令的模型。
现场示例 http://codepen.io/snater/pen/IjvFa
资料来源:
<div ng-app="asyncServiceTest" ng-controller="testController">
<bind-to-service></bind-to-service>
</div>
app = angular.module "asyncServiceTest", []
app.directive "bindToService", ["dataService", (dataService) ->
restrict: "E"
scope: {}
template: "<div>{{ test }}</div>"
link: (scope) ->
scope.test = dataService.test
]
app.factory "asyncService", ["dataService", "$timeout", (dataService, $timeout) ->
load: ->
dataService.test = "SYNC DATA!" # Works fine
$timeout ->
dataService.test = "ASYNC DATA!" # Doesn't work ((
, 2000
]
app.factory "dataService", ->
test: "Init Data"
app.controller "testController", ["$scope", "asyncService", ($scope, asyncService) ->
asyncService.load()
]
在 asyncService 中调用$rootScope上的$apply不起作用,这是意料之中的,但我已经尝试过了。
由于 javascript 的原型性质,在进行绑定时应该使用 .
表示法。我已经更新了实时示例。
http://codepen.io/anon/pen/jverH
基本上我把服务改成了
app.factory "dataService", ->
test: {data:"Init Data"}
并做了其他相应的更改。
基本上当你这样做时
scope.test = dataService.test;
您刚刚将范围test
值分配给了一个字符串。但是,对数据服务test
字符串所做的任何更改都不会按预期反映出来。在编程术语中,它就像按值传递。
阅读作用域原型继承及其工作原理,了解为什么您所做的不起作用。
代码的主要问题是,当数据使用异步方法更改时,您尝试更改测试对象的直接引用。这会导致问题,因为您将测试对象"REFERENCE"与指令的模型绑定在一起,因此不应更改它以使数据绑定处于活动状态。如果更改引用,则绑定将丢失。
因此,将数据保存在测试对象的属性中,如"test.value",并更改值而不是测试引用。
以下是更新的代码:
app = angular.module "asyncServiceTest", []
app.directive "bindToService", ["dataService", (dataService) ->
restrict: "E"
scope: {}
template: "<div>{{ test.value }}</div>"
link: (scope) ->
scope.test = dataService.test;
]
app.factory "asyncService", ["dataService", "$timeout", (dataService, $timeout) ->
load: ->
dataService.test.value = "SYNC DATA!"
$timeout ->
dataService.test.value = "ASYNC DATA!"
, 2000
]
app.factory "dataService", ->
test: {value:""};
app.controller "testController", ["$scope", "asyncService", ($scope, asyncService) ->
asyncService.load()
]
以下是更新的链接:
http://codepen.io/kalyansriram/pen/BCmla
相关文章:
- 当视图在AngularJS中返回时,我如何获得异步服务调用来更新视图
- 如何在Angular中设置异步HTTP服务的回调,以便在不定义数组的情况下在控制器中填充数组
- 如何访问回调函数之外的异步angularjs服务数据
- 异步http请求服务
- 在异步内部函数返回 [UI-路由器和 HTML 服务] 之后返回外部 fn
- 如何将指令模型绑定到异步服务数据
- 如何从 angularjs 服务中的异步调用返回响应
- 将 Javascript .js(调用 Web 服务)异步加载到页面中
- AngularJS函数在多次异步服务调用后
- 异步服务调用不工作
- 如何在调用异步Web服务响应时将值设置为数组
- Angular:在控制器之间共享异步服务数据
- 将一个服务(工厂)注入到另一个服务中,这两个服务都是异步的
- Angular.js将数据从异步服务传递到作用域
- 用TypeScript编写的Geocoder谷歌地图服务的因果报应异步测试
- 如何在服务中使用异步库
- 如何在javascript中实现异步服务调用
- 异步服务调用后,nhandsontable数据流未定义
- 如何将异步服务中的数据设置到控制器$scope中?
- 避免在Angular.js中重复异步服务初始化