Javascript 从Angular.js中的视图修改方法中数据的最佳实践

Javascript 从Angular.js中的视图修改方法中数据的最佳实践,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,我正在写一个angular应用程序来显示可以打开和关闭的报告。我决定为accordion的报表对象添加一些特定于视图的值,如下所示: var report = [{ "testName": "Cool Test", "successful": true, "openAccordion": "in" //this was added for bootstrap's sake to say whether this test in the report is collapse

我正在写一个angular应用程序来显示可以打开和关闭的报告。我决定为accordion的报表对象添加一些特定于视图的值,如下所示:

var report = [{
    "testName": "Cool Test",
    "successful": true,
    "openAccordion": "in" //this was added for bootstrap's sake to say whether this test in the report is collapsed or not
}]
bookApp.factory('report', function() {

    this.getReport = function() {
        [...]
        return report;
    }

    this.setAccordions = function(report, setting) {
        [set all tests to setting's value ...]
    }

    return this;

});
我想这样我就可以更新我的模型,双向数据绑定将崩溃并为我解压

不过,我现在想做的是,我想添加一些按钮来做这些事情。例如,我需要一个按钮,将报表中的所有测试设置为
“openAccordion”:“
中的”打开所有测试,另一个按钮将它们设置为
“openAccordion”:“
关闭所有测试

我想我可以编写一个服务,它的功能如下:

var report = [{
    "testName": "Cool Test",
    "successful": true,
    "openAccordion": "in" //this was added for bootstrap's sake to say whether this test in the report is collapsed or not
}]
bookApp.factory('report', function() {

    this.getReport = function() {
        [...]
        return report;
    }

    this.setAccordions = function(report, setting) {
        [set all tests to setting's value ...]
    }

    return this;

});

我想我喜欢这样,但是,使用
ng单击
启动
setAccordions
功能的最佳方式是什么?我是否必须将该服务功能设置为my
ReportCtrl
中my
$scope
的功能,或者我可以直接从视图中取消该服务功能?

您可以直接调用工厂功能,但首先控制器必须将其绑定到控制器的作用域:

myApp.controller('Ctrl', function ($scope, report) { 
    $scope.setAccordions = report.setAccordions;
}
然后您可以使用:

<button ng-click="setAccordions(true)">Set to true </button>
设置为true

您可以直接调用工厂函数,但首先控制器必须将其绑定到控制器的作用域:

myApp.controller('Ctrl', function ($scope, report) { 
    $scope.setAccordions = report.setAccordions;
}
然后您可以使用:

<button ng-click="setAccordions(true)">Set to true </button>
设置为true

它必须是控制器中的范围变量才能从视图访问它。它必须是控制器中的范围变量才能从视图访问它。这很有意义。但似乎有点奇怪。如果我有一堆控制器,并且我想在所有这些控制器中重用相同的服务功能,那将是大量重复的代码,我已经读到,将方法绑定到
$rootScope
被认为是非常糟糕的做法。在接受之前,我将给您一点时间,看看是否有其他人知道其他方法可以这样做。您没有绑定到$rootscope。你说得对,那太糟糕了。您正在绑定到控制器作用域。从可读性的角度来看,每个控制器都需要包含服务,这实际上是一个加号——它让代码的任何读者都清楚哪些控制器依赖于该服务。但你是对的,它确实意味着额外的代码。我只是说,我所知道的重复代码的唯一替代方法是绑定到$rootScope,这被认为是不好的。是的,这是一个好的观点。而重复的代码,因为它很小并且只是建立一个绑定,从可读性和可维护性的角度来看,被认为是好的。但你是对的,它有点不利于干燥(不要重复你自己)的谷物。但很多人认为这是一个净收益。但似乎有点奇怪。如果我有一堆控制器,并且我想在所有这些控制器中重用相同的服务功能,那将是大量重复的代码,我已经读到,将方法绑定到
$rootScope
被认为是非常糟糕的做法。在接受之前,我将给您一点时间,看看是否有其他人知道其他方法可以这样做。您没有绑定到$rootscope。你说得对,那太糟糕了。您正在绑定到控制器作用域。从可读性的角度来看,每个控制器都需要包含服务,这实际上是一个加号——它让代码的任何读者都清楚哪些控制器依赖于该服务。但你是对的,它确实意味着额外的代码。我只是说,我所知道的重复代码的唯一替代方法是绑定到$rootScope,这被认为是不好的。是的,这是一个好的观点。而重复的代码,因为它很小并且只是建立一个绑定,从可读性和可维护性的角度来看,被认为是好的。但你是对的,它有点不利于干燥(不要重复你自己)的谷物。但许多人认为这是一个净收益。