【问题标题】:How to update binding for async model change of shared service property for several controllers in AngularJS[?如何更新AngularJS中多个控制器的共享服务属性的异步模型更改绑定[?
【发布时间】:2015-10-08 18:50:59
【问题描述】:

我有一个在多个控制器之间共享模型的服务。此模型是异步更新的(在插件的回调中)。我遇到了更新模型没有更新几个控制器/视图对上的绑定的问题。我能想到的唯一方法是让每个控制器向服务传递一个包含 $scope.$apply 的回调函数。每当模型更新时,每个回调都会运行。这对我来说似乎真的很乱。有更好的方法吗?

这是我的示例 sn-p,只有 1 个控制器。要记住的重要一点是,在触发更改后,您导航到使用不同控制器共享服务的不同页面(因此不会调用控制器事件来更新 $scope):

angular.module('myApp', [])

.controller('MyController', ['myServ', function(myServ) {
	var controller = this;
	
	controller.myObject = myServ.myObject;
	
	controller.onChnge = function() {
		myServ.makeChange();
	};
	
}])

.factory('myServ', [function () {
	// Definitions ==============================
	var service = {};
	service.myObject = { value1: 25 };
	
	service.makeChange = function() {
		if (service.myObject.value1 === 25)
			setTimeout(function() { 
				service.myObject.value1 = 10;
			}, 1000);
		else
			setTimeout(function() { 
				service.myObject.value1 = 25;
			}, 1000);
	}
	
	return service;
}])
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp">
	<div ng-controller="MyController as ctrl">
		Value: {{ ctrl.myObject.value1 }}<br>
		<button ng-click="ctrl.onChange()">Make Change</button>
	</div>
</div>

更新:明确了异步模型更改的来源。删除了一些不需要的代码位。

【问题讨论】:

    标签: javascript angularjs angularjs-scope


    【解决方案1】:

    不确定这是否是最佳解决方案,但我使用 $watch 来做到这一点。

    $scope.UserService = UserService;
    $scope.$watch('UserService.getCurrentUser()', function (newVal) {
        $scope.currentUser = newVal;
    }, true);
    

    编辑

    使用 Angular 的 $timeout 而不是 setTimeout 应该注意调用 apply() 以掌握所有异步内容。 https://coderwall.com/p/udpmtq/angularjs-use-timeout-not-settimeout

    【讨论】:

    • 我实际上尝试了 $watch ,但仅在处理摘要时才查看它们。由于我的模型是异步更新的,因此不会触发摘要,因此 $watch 不会做任何事情。
    • 啊,好一个....你可以使用 angulars $timeout 而不是 setTimeout。 $timeout 会为你调用 apply()。 coderwall.com/p/udpmtq/angularjs-use-timeout-not-settimeout
    • Arg,我以为你有它!问题是我的数据没有超时更新,它是通过蓝牙插件的回调更新的。我正在尝试找出一种使用它的方法,但到目前为止还没有运气。
    • 事实证明问题在于我如何更新模型,而不是绑定。我会将您的答案设置为正确的答案,因为它回答了我发布的问题。
    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多