angularJs中控制器和服务之间的数据绑定

时间:2017-02-23 18:59:57

标签: javascript angularjs data-binding angular-services angular-factory

我想知道正确的方法,我有一个服务,一个工厂和一个控制器。

该服务具有<template> <div id="app"> <img src="./assets/logo.png"> <hello></hello> <parallax src=require('../assets/logo.png')></parallax> </div> </template> <script> import Hello from './components/Hello' //import parallax ? export default { name: 'app', components: { Hello, parallax } } </script> <style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style> 属性,默认情况下以selectedTable开头,用于存储所选表格,以便在工厂和控制器中使用;该服务还有一个null属性,它在工厂和控制器中定期更新,该服务如下所示:

touches

工厂通过设置变量Module.service('tablesService', function(){ this.data = { selectedTable: null, touches: 0 } }); 来使用该服务,并使用方法var data = tablesService.data修改selectdata.selectedTable的值:

data.touches

控制器查看每个if (data.selectedTable === this){ data.touches++; if (data.touches === 2) { data.selectedTable = null; } } else { if (data.selectedTable && data.selectedTable != this) { data.touches++; data.selectedTable.select(); } data.selectedTable = this; } 事件的表格列表,当它发现被点击的表格时,它会调用它的onClick方法,即工厂中的方法,如果点击的表格是在selectedTable中,它会更改select()变量,因此当它调用touches方法时,select()获取selectedTable作为新价值。

null

问题在于,更改$scope.tablesData = tablesService.data; $scope.selectedTable = $scope.tablesData.selectedTable; $scope.touches = $scope.tablesData.touches; $scope.findTable = function(event){ $scope.touches = 0; for(t in $scope.tables) { var table = $scope.tables[t]; var result = table.findMe(event.offsetX,event.offsetY); if(result.type === 'table') { if ($scope.selectedTable === table){ $scope.touches++; } table.select(); break; } } 不会更新服务中的变量,反之亦然,这也适用于selectedTable,我尝试在$scope.touches上使用$watch }和$scope.touches,但每次更改$scope.tablesData.touches时,$digest()方法都不会启动,因此我必须致电$scope.touches,这看起来很糟糕,并且没有一直解决问题。

我的观察者看起来像这样:

$apply()

阅读这篇文章http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/我发现我可以通过$ rootScope。$ broadcast()向应用程序广播一个事件,但我不确定如何实现这个,也许那个&#39 ; s不是解决问题的最佳方法。

0 个答案:

没有答案