Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 工厂生产的功能不工作,但在控制器中使用时工作。为什么?_Angularjs - Fatal编程技术网

Angularjs 工厂生产的功能不工作,但在控制器中使用时工作。为什么?

Angularjs 工厂生产的功能不工作,但在控制器中使用时工作。为什么?,angularjs,Angularjs,我在工厂中定义了一个名为updateUser()的函数。如果我注入factory并将函数分配给视图中要使用的范围,然后调用它,它将无法正常工作。我希望它能更新用户。相反,它只是创建一个新用户 但是,当我使用相同的函数并在控制器中定义它并在视图中调用它时,它会按预期工作。我不明白!任何帮助都将不胜感激 这是我的密码: 工厂 (function(){ 'use strict'; angular .module('casemanagerApp') .factory('$cmUserD

我在工厂中定义了一个名为updateUser()的函数。如果我注入factory并将函数分配给视图中要使用的范围,然后调用它,它将无法正常工作。我希望它能更新用户。相反,它只是创建一个新用户

但是,当我使用相同的函数并在控制器中定义它并在视图中调用它时,它会按预期工作。我不明白!任何帮助都将不胜感激

这是我的密码:

工厂

(function(){
  'use strict';

  angular
  .module('casemanagerApp')
  .factory('$cmUserData', $cmUserData);

  function $cmUserData($log, Restangular) {

    return {
      users: users,
      getUser: getUser,
      updateUser: updateUser
    };

    function users() {
      return Restangular.service('users');
    }

    function getUser() {
      return users().one(1).get().$object;
    }

    function updateUser() {
      Restangular.all('users')
      .post(getUser())
      .then(function(){
        $log.info('User updated');
      });
    }

  }

})();
(function(){
  'use strict';

  angular
  .module('casemanagerApp')
  .factory('$cmUserData', $cmUserData);

  function $cmUserData($log, Restangular) {

    return {
      users: users,
      getUser: getUser,
      updateUser: updateUser
    };

    function users() {
      return Restangular.service('users');
    }

    function getUser() {
      return users().one(1).get().$object;
    }

    function updateUser(model) {
      Restangular.all('users')
      .post(model)
      .then(function(){
        $log.info('User updated');
      });
    }

  }

})();
控制器

(function() {
  'use strict';

  angular
  .module('casemanagerApp')
  .controller('CasePlanGoalsCtrl', CasePlanGoalsCtrl);

  function CasePlanGoalsCtrl($log, $cmUserData) {
    var vm = this;

    // Injections
    vm.user = $cmUserData.getUser();

    // Functions
    // vm.updateUser = $cmUserData.updateUser; <-This doesn't work
    vm.updateUser = updateUser; // This will work

    function updateUser() {
      Restangular.all('users')
      .post(vm.user)
      .then(function() {
        $log.info(vm.user.firstName + ' was updated');
      });
    }

  }

})();
(function() {
  'use strict';

  angular
  .module('casemanagerApp')
  .controller('CasePlanGoalsCtrl', CasePlanGoalsCtrl);

  function CasePlanGoalsCtrl($log, $cmUserData) {
    var vm = this;

    // Injections
    vm.user = $cmUserData.getUser();

    // Functions
    vm.updateUser = $cmUserData.updateUser;

  }

})();
(函数(){
"严格使用",;
有棱角的
.module('casemanagerApp')
.controller('CasePlanGoalsCtrl',CasePlanGoalsCtrl');
函数CasePlanGoalsCtrl($log,$cmUserData){
var vm=这个;
//注射
vm.user=$cmUserData.getUser();
//功能

//vm.updateUser=$cmUserData.updateUser;您的控制器正在工作,但实际执行的操作与您的工厂不同。在调用Restangular.getUser()填充该变量很久之后,它一直在使用vm.user对象。若要断开控制器并使其功能与工厂相同,请更改以下内容:

function updateUser() {
  Restangular.all('users')
  .post(vm.user)
  .then(function() {
    $log.info(vm.user.firstName + ' was updated');
  });
}

您的控制器为Restangular提供了解析它正在调用的对象的机会,而您的服务正在调用getUser函数并立即尝试使用该函数的结果来执行POST

如果上述代码的中断方式与服务的中断方式相同,那么您至少知道问题发生的原因。这是因为Restangular向您提供了一个它承诺要填充的对象,但当您的service updateUser函数尝试使用该对象时,它尚未填充

当您调用getUser时,Restangular会立即返回一个对象,但此时该对象中没有任何内容!当服务器返回调用时,Restangular将填充该shell。您需要确保将实际用户对象传递给工厂


对此没有一个明显的答案。可能您将getUser的结果缓存在工厂中,或者您将用户传递到updateUser()中factory函数。我怀疑Restangular有一种建议您这样做的方式,但我对它不太熟悉,因此我无法帮助您解决其中的具体问题。

需要将vm.user传递给工厂的updateUser()函数,因为@shieldstroy说:

工厂

(function(){
  'use strict';

  angular
  .module('casemanagerApp')
  .factory('$cmUserData', $cmUserData);

  function $cmUserData($log, Restangular) {

    return {
      users: users,
      getUser: getUser,
      updateUser: updateUser
    };

    function users() {
      return Restangular.service('users');
    }

    function getUser() {
      return users().one(1).get().$object;
    }

    function updateUser() {
      Restangular.all('users')
      .post(getUser())
      .then(function(){
        $log.info('User updated');
      });
    }

  }

})();
(function(){
  'use strict';

  angular
  .module('casemanagerApp')
  .factory('$cmUserData', $cmUserData);

  function $cmUserData($log, Restangular) {

    return {
      users: users,
      getUser: getUser,
      updateUser: updateUser
    };

    function users() {
      return Restangular.service('users');
    }

    function getUser() {
      return users().one(1).get().$object;
    }

    function updateUser(model) {
      Restangular.all('users')
      .post(model)
      .then(function(){
        $log.info('User updated');
      });
    }

  }

})();
控制器

(function() {
  'use strict';

  angular
  .module('casemanagerApp')
  .controller('CasePlanGoalsCtrl', CasePlanGoalsCtrl);

  function CasePlanGoalsCtrl($log, $cmUserData) {
    var vm = this;

    // Injections
    vm.user = $cmUserData.getUser();

    // Functions
    // vm.updateUser = $cmUserData.updateUser; <-This doesn't work
    vm.updateUser = updateUser; // This will work

    function updateUser() {
      Restangular.all('users')
      .post(vm.user)
      .then(function() {
        $log.info(vm.user.firstName + ' was updated');
      });
    }

  }

})();
(function() {
  'use strict';

  angular
  .module('casemanagerApp')
  .controller('CasePlanGoalsCtrl', CasePlanGoalsCtrl);

  function CasePlanGoalsCtrl($log, $cmUserData) {
    var vm = this;

    // Injections
    vm.user = $cmUserData.getUser();

    // Functions
    vm.updateUser = $cmUserData.updateUser;

  }

})();
视图。请参见ng更改

<md-switch 
    aria-label="Stack Cards" 
    ng-model="vm.user.settings.stackCards" 
    ng-true-value="'isStacked'" 
    ng-false-value="'!isStacked'" 
    ng-change="vm.updateUser()" 
    class="text-uppercase-small pull-right">
    Stack Cards
</md-switch>
<md-switch 
    aria-label="Stack Cards" 
    ng-model="vm.user.settings.stackCards" 
    ng-true-value="'isStacked'" 
    ng-false-value="'!isStacked'" 
    ng-change="vm.updateUser(vm.user)" 
    class="text-uppercase-small pull-right">
    Stack Cards
</md-switch>

堆叠卡片

如果更改控制器的updateUser以调用服务,该怎么办。函数updateUser(){$cmUserData.updateUser();};是否如预期的那样工作?@shieldstroy我试过了,但也不起作用。结果与我在上面代码中所做的调用相同。不过谢谢你的建议。当你尝试这样做时,它会给你任何错误或控制台中的任何东西吗?你的其他调用是否使用Restangular服务工作?没有错误。其他一切都是你的sing Restangular服务正在按预期工作。因此,如果您在服务的updateUser函数中登录(或设置断点),它甚至没有进入其中,对吗?太奇怪了……您可以在plunkr或codepen上重新创建问题吗?如果您的控制器设置为调用该服务,并在调用该服务的线路上设置断点($cmUserData.updateUser())您能看到作为$cmUserData属性列出的函数吗?第一段代码就是可以工作的部分。我想使用服务中的函数,而不是控制器中的函数。但我只能在控制器中使用该函数才能使其工作。那么,不工作的是updateUser()吗工厂中的函数。这就是为什么它不工作的原因,当它基本上在ctrl中使用相同的函数时,它就工作了。我知道第一件是工作的,我只是想让它以工厂被破坏的同样方式被破坏。如果你把它改成第二个实现,那么它应该会被破坏。如果是的,你知道问题出在哪里了。哦..是的,是的,坏了。注意了。所以问题出在$cmUserData.getUser()上?我编辑了我的答案,希望能让它更清楚。我修复了它!你帮了我大忙。我马上发布我的答案。