2017-08-09 126 views
0

学习AngularJS对我来说是一项工作,所以我只想了解为什么/何时我们应该在下面的特定情况下使用一个。这只是味道的问题还是比这更重要?看下面的例子。

在这两种情况下,当用户单击确定按钮,create()父控制器的功能从子控制器调用。

RESOLVE风格

CreateController

... 

var vm = this; 

vm.create = create; 

function create() { 
    console.log('Created!'); 
} 

vm.openCreateModal = function() { 
    vm.modalInstance = $uibModal.open({ 
     ... 
     resolve: { 
      create: function() { 
       return create; 
      }, 
      // Others if any 
     } 
    }); 
} 

... 

CreateModalController

... 

vm.ok = function() { 
    create(); 
    $uibModalInstance.close('ok'); 
}; 

... 

SCOPE风格

CreateController

... 

var vm = this; 

vm.create = create; 

function create() { 
    console.log('Created!'); 
} 

vm.openCreateModal = function() { 
    vm.modalInstance = $uibModal.open({ 
     ... 
     scope: $scope, 
     resolve: { 
     } 
    }); 
} 

... 

CreateModalController

... 

vm.ok = function() { 
    $scope.$parent.vm.create(); 
    $uibModalInstance.close('ok'); 
}; 

... 

更新

实际的原因,我问这个问题时,accessining /注射父/根/容器状一个serv的对象在另一个控制器/服务中的冰/控制器在我使用的某些语言/框架中被认为是“不好的做法”。

+1

'$ parent'的使用是一个[code smell](https://en.wikipedia.org/wiki/Code_smell),是一个更深层次问题的症状。 “解析”属性更通用且更健壮,因为它对于模态的每个实例都可能不同。它也可以用承诺来解决。 – georgeawg

+0

@georgeawg我加了“更新”部分来解释为什么我想出这个问题。你踩在它上面!由于某种原因,我只是不喜欢'$ scope。$ parent ...'。我只需要等待,看看别人怎么说的。 – BentCoder

回答

1

resolve的想法是它会在初始化其余代码之前运行它。通常你会在你的routing使用resolve像这样:

$routeProvider 
     .when('/', { 
      templateUrl: "views/view.html", 
      caseInsensitiveMatch: true, 
      resolve: { 
       load: function() { 
        localStorage['Location'] = "/View"; 
       } 
      } 
     }) 

在上面的例子resolve将触发load function是不断初始化我的控制器之前。另一方面,scope用于直接绑定到控制器或指令中的某些内容。触发函数并绑定控制器和指令之间的值时,应该使用scope

要添加到此基于下面的评论,如果resolve失败它将拒绝模式和窗口不会打开。

+0

OP询问[UI-Bootstrap Modal Directive]中的'resolve'属性(https://angular-ui.github.io/bootstrap/#!#modal)。 – georgeawg

+0

这是正确的答案,但值得一提的是,如果解决失败(承诺拒绝),过渡将被取消,模态将不会显示。这种模式在角度上很常见。 – svarog

+0

我将这一点添加到我的答案。 @georgeawg我知道他在谈论引导模式。我只是提供了一个例子,说明如何在Angularjs中工作,以及何时使用它,比如OP所要求的范围。 – Ohjay44