【问题标题】:Creating a controller/service to persist data, with information from the DOM使用来自 DOM 的信息创建一个控制器/服务来持久化数据
【发布时间】:2015-03-05 20:59:23
【问题描述】:

在 Angular 中,我在一个视图中有一个项目列表,这些项目将根据它们是否被选中而显示在另一个视图中。

这是您检查要在另一个视图中显示的运动的视图

<ion-item ng-repeat="sport in sports"
          ng-init="sport.checked = true"
          ng-click="sport.checked = !sport.checked">
    {{:: sport.name}}
</ion-item>

这是另一个视图

<div ng-show="sport.checked"
  ng-repeat="sport in sports">
    {{sport.name}}
</div>

您看到所有这些运动都有一个ng-init = sport.checked = true,所以所有运动都显示在开头,但您可以取消选中这些运动,以便在再次选中之前看不到它们。

这就是我到目前为止所拥有的一切,但是一旦你刷新页面,所有的检查和取消检查都会消失,刷新后一切都会重新启动,所以你知道我需要将数据保存在数据库或其他东西中,我正在使用node.js/sails.js 以及 Redis 用于此。我知道如何在 node.js 部分中创建几乎所有内容,但我需要在 Angular 部分的控制器和服务方面提供一些帮助,所以我需要你的帮助。

我希望用户只能检查一次他们的运动,而不是每次登录应用程序时。

那么当一项运动未被选中时,我可以向控制器添加哪些功能来向服务提供建议,以及服务将如何接收该数据?

另外,如果您对 NodeJS 部分有任何建议,那也太棒了。

【问题讨论】:

  • 听起来你想使用 sessionStorage/localStorage,或者如果你真的很大胆地潜入 indexeddb 的激动人心的世界。然而,这些东西并没有那么有棱角,因为它们是直接的 javascript。您可能需要将它们连接到服务。
  • 是的,兄弟,但是请阅读这个问题,我的意思是,我知道我必须做什么,我首先需要做的是将该信息发送到 Angular 控制器,然后发送到 Angular 服务,这是我首先需要知道的,然后我可以开始处理 NODEJS 部分@S.Buda
  • 您不需要将数据发送到角度控制器,看起来它应该已经在控制器中 - 无论您的运动对象放在哪里。从那里您可以创建一个服务并将其注入您的控制器。然后您可以根据需要处理数据。话虽如此,我看不出您在这方面需要 NodeJS 做什么,因为这让我觉得这是您想要作为客户端会话一部分的信息,而不是某些服务器状态。再说一次,我很少使用节点,所以可能是我不了解这方面的事情。
  • 我的应用中有用户想要注销,然后再次登录并查看他们的运动是否已选中和未选中,这不是您每次登录时都想做的事情,我希望用户只能检查一次他们的运动,而不是每次登录应用程序时。 @S.Buda,你说的我该怎么做?我是角新手
  • 我明白了。因此,您可以将该信息作为用户配置文件的一部分保存在某些服务器数据库中。我设想这将是您将使用 localstorage 或 indexeddb 存储在浏览器中的数据。我的声明仍然有效。将服务注入您的控制器,然后在您的服务中使用逻辑来执行您需要的操作(将其发布到您的服务器或将其保存在本地) - 例如angular.module("whatever").controller("controller", function(myDataService){

标签: javascript angularjs node.js sails.js


【解决方案1】:

这是您可以使用的示例。这是非常简陋的。所有$http 函数都使用promise。当控制器为空时,控制器将从服务获取设置,它会从服务请求新设置

angular.module('app').controller('appctrl',['appsrv','$scope',function(appsrv, $scope){
    $scope.settings = service.settings;
    if(!$scop.settings){
       //retrieve data from server when it's not in the service
       appsrv.getSettingsRemote().then($scope.settings = service.settings);
}

    }]).service('appsrv',[$http, function($http){

    return {
    getSettings :  function (){
    // get settings from localstorage
},
    setSettings :  function (){
    // store settings to localstorage
},
    getSettingsRemote : function () {

    $http.get('url').then(//set things locally);
}
}

}]);

然后从您的视图中,您可以将控制器分配给视图,然后参考您的设置,例如 {{settings.propname}}

我不想写你所有的代码,但也许这让你了解了你可以做什么

【讨论】:

  • 我需要在控制器中添加哪个功能才能捕捉到运动是否被检查?,我想像function() { $scope.sport = sport.checked = true },或者如何?
  • @NietzscheProgrammer 这应该通过角度数据绑定自动发生。您实际上是在 ng-click 上您拥有的那个 ion-item 中执行此操作。
  • @NietzscheProgrammer 除非您的意思是在该值更改时可以运行某些函数,在这种情况下您需要$scope.$watch("sport.checked",function(oldVal,newVal){/*Do something*/})
  • 或者当你调用ng-click="setSport(true)" 并且在你的控制器中有$scope.setSport = function(var setting){$scope.sport.checked = setting} 时,你可以为它创建一个方法。这是 angularjs 教程中处理的所有非常基本的东西
  • @VeldMuijz 这就是我提到的,完美。只是别的东西,为什么(var setting) 作为参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2013-01-17
相关资源
最近更新 更多