工厂和控制器之间的“绑定”

时间:2015-03-10 00:25:36

标签: javascript angularjs

我正在尝试返回从工厂到控制器的绑定范围。如果我可以传递这个名字,那将是理想的,因为它可能是动态的。这是我到目前为止所拥有的

.factory('urlWatch', function (urlFactory) {
    var _this = this;
    return {
        listenToUrl: function (scope, moduleName, stateName) {
          scope.$on('$locationChangeSuccess', function (event) {
            console.log(scope.bind);
            scope = urlFactory.parseState(moduleName, stateName);

          });
        }  
    };
    return _this;
});

在控制器中我有

$scope.mod1m3 = urlWatch.listenToUrl($scope, "module1", "mod1");

所以这不起作用,但如果我将工厂更改为这样

 listenToUrl: function (scope, moduleName, stateName) {
          scope.$on('$locationChangeSuccess', function (event) {
            console.log(scope.bind);
            scope.mod1m3 = urlFactory.parseState(moduleName, stateName);

          });
        }  

我想做的是将其改为

  listenToUrl: function (scope, moduleName, stateName, bind) {
          scope.$on('$locationChangeSuccess', function (event) {

            scope.bind = urlFactory.parseState(moduleName, stateName);

          });
        }

  $scope.mod1m3 = urlWatch.listenToUrl($scope, "module1", "mod1", "mod1m3");

然而它似乎并不想连接2,我得到了:

 TypeError: Cannot read property '$on' of undefined

不确定如何让它连接以使其按预期工作。谢谢!

1 个答案:

答案 0 :(得分:1)

由于$ scope attributre应该是动态的并保存在变量bind中,请使用:

listenToUrl: function (scope, moduleName, stateName, bind) {
  scope.$on('$locationChangeSuccess', function (event) {

    // use scope like an associative array
    scope[bind] = urlFactory.parseState(moduleName, stateName);
  });
}

如果使用,在控制器中就足够了。

urlWatch.listenToUrl($scope, "module1", "mod1", "mod1m3");

$ scope.mod1m3将是parseState返回的任何内容