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