Javascript 角度,设置回调函数以在工厂和控制器之间进行更新

Javascript 角度,设置回调函数以在工厂和控制器之间进行更新,javascript,angularjs,Javascript,Angularjs,我不确定我是否完全理解了这个想法,但我会尽我所能清楚地描述我在这里要做的事情 我有一个工厂,可以为我更改和解析URL,因此我可以将参数传递到控制器中以供使用(存储在URL中)。这有点像是我可以为用户保存一个状态,他们可以通过复制一个URL(发送给他们的朋友或书签或w/e)来共享它 我正在尝试设置一个侦听locationChangeSuccess的工厂(或服务),这样,如果用户输入url并按enter键,它将刷新控制器中的作用域。这就是我所拥有的: .factory("urlFactory"

我不确定我是否完全理解了这个想法,但我会尽我所能清楚地描述我在这里要做的事情

我有一个工厂,可以为我更改和解析URL,因此我可以将参数传递到控制器中以供使用(存储在URL中)。这有点像是我可以为用户保存一个状态,他们可以通过复制一个URL(发送给他们的朋友或书签或w/e)来共享它

我正在尝试设置一个侦听locationChangeSuccess的工厂(或服务),这样,如果用户输入url并按enter键,它将刷新控制器中的作用域。这就是我所拥有的:

   .factory("urlFactory", function($location, freshUrl, StateString){
     //request to change new url
    requestObj.requestState = function(moduleName, stateName, startVar){

    }

    //request item from url, via your module and state name
    requestObj.parseState = function(moduleName, stateName){

   }
我放弃了这个中心(如果需要的话,我很乐意链接),但是那些只是为我获取并设置了url

所以在控制器中,我做了一些类似于

 $scope.mod2m3 = urlFactory.parseState("module2", "mod3");
$scope.mod2m4 = urlFactory.parseState("module2", "mod4");
因此,当他们登陆页面时,他们会退出状态。这很有效。然而,现在我试图解决一些边缘情况,其中可能是用户修改url

这样我就可以很容易地抓住它了

 .factory("urlWatcher", function($location, $scope){
    var urlWatcher = {};
     $scope.$on('$locationChangeSuccess', function(event) {
            console.log("Asdsa");
       });

     return urlWatcher
});
然而,我正在努力确定一种方式,当它触发时,它会将新值连接到控制器中的作用域。有人向我建议在parse(set)函数中使用某种回调,但我正在努力解决这个问题。如果我能为这个工厂/服务设置一种方式,当它更改到正确的位置时,重新发送新值,那就太酷了。回调听起来不错,但我不知道如何正确配置

最简单的方法就是做一个简单的测试

 $scope.$on('$locationChangeSuccess', function(event) {
            console.log("Asdsa");
       });
在每个控制器中,手动绑定到每个作用域,但我正在尝试使其尽可能模块化(这也是locationchangesuccess上的大量观察者)。如果我能找到一种干净的方法,将服务/工厂设置为侦听一次,并在更改时找到正确的模块/控制器并更改值,那将是非常棒的


我似乎想不出一条清晰的路线,所以我非常希望能对这个问题有任何见解。非常感谢您的阅读

如果您想要的是发布/订阅体系结构,其中发布是全局的,订阅与角度作用域具有相同的生命周期。。。那么角度事件就是你要找的。建立一个带有回调等功能的特别通信系统是没有意义的,这只是部分地改造事件

但是,如果您想使语义更加明显/增加灵活性,可以在服务中收听一次
$locationChangeSuccess
,然后广播一个自定义事件

$rootScope.$on("$locationChangeSuccess", function (event) {
  $rootScope.$broadcast('myCustomeEvent', {message: "Guys, time to refresh!"});
});
然后在与此相关的每个作用域中聆听此事件

$scope.$on('myCustomeEvent', function (event) {
  console.log("Asdsa");
});
如果听力设置变得重复,请务必在功能中进行考虑,例如,您可以将其放在服务中:

myApp.factory('someFactory', [function () {
  return {
    listenToLogAsdsa: function (scope) {
      scope.$on('myCustomeEvent', function (event) {
        console.log("Asdsa");
      });
    }  
  };
}]);
那么,您只需在控制器中写入以下内容:

someFactory.listenToLogAsdsa($scope);

您可以将作用域中的变量指定给工厂中的对象,这样它就绑定到引用而不是值。然后,在HTML中将引用绑定到DOM。然后,urlFactory.parseState()应将结果保存到所述对象,并返回保存结果的键
例如:
在工厂内:

requestObj.parseState = function(moduleName, stateName){
var key = moduleName+stateName;
this.urlContainer[key] = "www.example.com";
return key;

   }
在控制器中:

$scope.urls = urlFactory.urlContainer;
$scope.mod2m3 = urlFactory.parseState("module2", "mod3");
在HTML中:

{{urls[mod2m3]}}
通过这种方式,“URL”被绑定到一个引用,该引用监视更改,并且无论何时更改URL[mod2m3],它都会影响DOM。
您也可以通过观察范围变量的变化来对其作出反应:

 $scope.$watch('urls', function() {
       //do something
   });

注意:由于这是一个对象,您可能需要使用$watchCollection而不是$watch。

您可以在绑定范围变量的地方发布HTML吗?@Eyal在HTML中的字面意思是{{myvar}}这是一个很好的答案,但是我不确定它是否完全符合我的需要-页面上的每个项目都是它自己的单独模块,我有大约50种不同的东西要听。因此,我必须为每一个单独设置一个侦听器。根本的想法正是我所寻找的,但是我试图将它设置为一个“黑盒子”,当它进来时,它将决定发送到哪里。因此,如果url中有40个对象和3个更改,它将知道发送。对于单个模块中的3个控制器,因此第一个回调思想认为这是不可能的。你必须在某个地方澄清,当某些事情发生时,必须进行更新。在我看来,只需一行代码就可以做到这一点。您只依赖于发送事件的服务。减少依赖似乎是不可能的。特别是如果您只是将解析状态的初始赋值也放在
someFactory
中的
$scope
中。对我来说,您关心的是代码组织,而不是传输。但是如果你真的不相信提议的内容,你应该试着按照你想象的方式去做——这不会有那么多工作。啊,酷。好吧,如果它从未在html中绑定呢?这些人中的一些人只是在后台控制事情。如果你不将他们绑定到DOM,而只是将其用于功能,那么你需要添加一个观察者并对更改做出反应。我在答案中加了一个简短的例子