我正在建立一个电子商务网站(基于shopify),我正在使用多个小型angularjs应用程序来处理诸如快速购物车,愿望清单,过滤产品和一些其他小物品之类的东西。我最初使用了一个大型应用程序(具有路由和所有内容),但是当我没有完整的REST API时,它有点限制性。
我想在角度应用程序之间分享一些服务(购物车服务,所以我可以有一个快速添加按钮,将反映在迷你购物车等),但我不确定最好的方法(如果有办法)去解决这个问题。仅与服务共享模块不会在应用程序中保持相同的状态。
我尝试了它,但我似乎并没有更新两个应用程序之间的状态。以下是我尝试使用的javascript。这也是jsfiddle上附带的html:http://jsfiddle.net/k9KM7/1/
angular.module('test-service', [])
.service('TestService', function($window){
var text = 'Initial state';
if (!!$window.sharedService){
return $window.sharedService;
}
$window.sharedService = {
change: function(newText){
text = newText;
},
get: function(){
return text;
}
}
return $window.sharedService;
});
angular.module('app1', ['test-service'])
.controller('App1Ctrl', function($scope, TestService){
$scope.text = function(){ return TestService.get() }
$scope.change = function(){ TestService.change('app 1 activated') }
});
angular.module('app2', ['test-service'])
.controller('App2Ctrl', function($scope, TestService){
$scope.text = function(){ return TestService.get() }
$scope.change = function(){ TestService.change('app 2 activated') }
});
var app1El = document.getElementById('app1');
var app2El = document.getElementById('app2');
angular.bootstrap(app1El, ['app1', 'test-service']);
angular.bootstrap(app2El, ['app2', 'test-service']);
任何帮助将不胜感激
答案 0 :(得分:25)
sharedService
正在共享,但是一个角度应用程序不知道在其他应用程序中更新了某些内容,因此它不会启动$digest
。您必须通过致电$rootScope
$digest
以$rootscope.$apply()
开头
小提琴:http://jsfiddle.net/pvtpenguin/k9KM7/3/
angular.module('test-service', [])
.service('TestService', function($rootScope, $window){
var text = 'Initial state';
$window.rootScopes = $window.rootScopes || [];
$window.rootScopes.push($rootScope);
if (!!$window.sharedService){
return $window.sharedService;
}
$window.sharedService = {
change: function(newText){
text = newText;
angular.forEach($window.rootScopes, function(scope) {
if(!scope.$$phase) {
scope.$apply();
}
});
},
get: function(){
return text;
}
}
return $window.sharedService;
});
答案 1 :(得分:3)
我试图解决类似的问题。在不同iFrame中运行的应用程序之间共享工厂。我希望任何帧中的任何$apply()
都能在所有其他帧中产生摘要周期。允许简单ng-clicks
直接绑定到工厂方法以更新所有其他帧中的视图。我创建了一个处理范围绑定和工厂共享的模块:
只需在每个应用程序中包含该模块:
angular.module('App', ['iFrameBind'])
并更改任何工厂的return语句以返回该工厂的共享版本:
return sharedFactory.register('counter', service);
e.g。
.factory('counter', function (sharedFactory) {
var service;
var val = 0;
function inc() {
val++;
}
function dec() {
val--;
}
function value() {
return val;
}
service = {
inc: inc,
dec: dec,
value: value
};
return sharedFactory.register('counter', service);
})
.directive('counter', function (counter) {
return {
template: '{{counter.value()}} ' +
'<button ng-click="counter.inc()">Up</button> ' +
'<button ng-click="counter.dec()">Down</button> ',
restrict: 'E',
link: function postLink(scope) {
scope.counter = counter;
}
};
});
在
中单击时,两个帧中的计数器都会更新