0

语境:

我正在使用Angularui-router ...

我有一个带有模板“ ParentTempl ”的父控制器“ ParentCtrl

在 ParentTempl 中有 2 个状态的视图:添加编辑

我想从 ParentCtrl“ abstractUpdate ”调用一个函数,该函数根据哪个状态是活动的来改变它的行为。

当前代码:

app.config(function($stateProvider, $urlRouterProvider) {
    $stateProvider
    .state('add', {
        template: "...", 
        abstractUpdate = function(object){
            // do add things
        }
    })
    .state('edit', {
        template: "...", 
        abstractUpdate = function(object){
            // do edit things
        }
    });
}

app.controller('ParentCtrl', function ($scope, $state) {
    $scope.click = function(obj){
        $state.current.abstractUpdate(obj);
    }
}

问题:

当前版本正在运行,但您认为这是最好的解决方案吗?有什么建议么?

4

2 回答 2

0

拥有两个独立的功能,每个功能执行各自的任务会更清楚。这是一个更好的编程习惯,imo。

您可以为每个子视图创建一个控制器,并且仍然拥有每个子视图ParentCtrl的父级。每个子控制器都可以有自己的单击处理程序,该处理程序在父控制器上调用“编辑”或“新建”方法(除非将该代码完全或部分放在每个子控制器上更有意义)。

于 2015-03-10T00:53:39.797 回答
0

通常你会使用工厂或服务来做这样的事情。这样你就不会用应用程序逻辑阻塞你的路由。您可以只注入$state您的工厂/服务,以便您可以根据您所处的状态处理事情:

angular.module('myApp').factory('MyService', [
    '$state',
    function ($state) {
      return {
        myMethod: function (obj) {
          if (this.hasOwnProperty($state.current.name)) {
            this[$state.current.name](obj);
          }
        },
        add: function (obj) {
          // do stuff
          return obj;
        },
        edit: function (obj) {
          // do stuff
          return obj;
        }
      }
    }
]);

现在您可以从任何您想要的控制器使用您的服务,只需注入它:

 angular.module('myApp').controller('myController', [
     '$scope',
     'MyService',
     function ($scope, MyService) {
         $scope.obj = {};
         $scope.obj = MyService.myMethod(obj);
     }
 ]);
于 2015-03-10T01:20:57.033 回答