Skip to content

Instantly share code, notes, and snippets.

@guo-yu
Last active March 17, 2016 02:31
Show Gist options
  • Save guo-yu/5908791 to your computer and use it in GitHub Desktop.
Save guo-yu/5908791 to your computer and use it in GitHub Desktop.
使用Angular进行ngResource模块的注入,并组织一个Store模块进行数据的获取,写入和分析
html(ng-app="app")
head
title demo
body
#wrap(ng-controller="myCtrl")
h1 我是 {{me.name}} , 我已经 {{me.age}} 岁了
// 注册app
var app = angular.module('app', ['store']);
// 定义这个数据仓库
var store = angular.module('store', ['ngResource']).factory('Store', function($resource) {
return {
// define user api
user: $resource('/user/:id', {id:'@uid'}),
// define article api
article : $resource('/article/:id', {id:'@aid'}),
// define jsonp api
remote : $resource('/remoteData/:id', {id:'@rid'},{
jsonp :{
method:'JSONP',
params:{
yourKey: 'yourValue'
}
}
})
}
})
// 在ctrler里使用这个Store获取数据
var myCtrl = function($scope, Store) {
// fetch a user target
var user = Store.user.get({uid:123}, function() {
// 填入数据
$scope.me = user;
// 写入新数据
user.abc = true;
// 会执行post请求
user.$save();
// console.log this user
console.log(user)
});
})
@ZoomQuiet
Copy link

问题是几个关键点没有理解,官方的文档也解说的比较零碎,

  • 俺猜对应的 dom 应该是:

    <!doctype html>
    <html lang="zh" ng-app='app'>
    ...
    
    <div ng-model="store">
    <div ng-controller="myCtrl">
    ..
    
  • 最后也忘记了:

    myCtrl.$inject = ['$resource'];
    

是也乎?!

其实 $resource 理解困难的无非是几处:

  • 怎么声明,怎么使用
  • 声明时 $resource('/article/:id', {id:'@aid'}) 怎么理解?
    • @aid 的含义是什么?
    • 是指返回的 json 中,有 aid 为键的值 ,对应此时的 id?
  • user.abc = true; 是什么配置含义?
  • 失败时,怎么获得句柄并处置?
  • 成功时,怎么判定,并获得数据?

相比 $http $resource 齐整很多,但是,综合起来,目前,俺绕不清楚,,,

@guo-yu
Copy link
Author

guo-yu commented Jul 2, 2013

是这样的:

  1. 首先在需要使用到的dom上声明app,比如在html标签上声明:html(ng-app="app")
  2. 然后再需要用到的dom上绑定ctrl,比如 #header(ng-controller="myCtrl")
  3. 这样这个dom其实就和这个ctrl的 $scope 进行了绑定。你可以在这个ctrl 里利用这个 Store进行数据操作,然后填入到 $scope 里,angular会自动对dom进行更新。

解释几个疑问:

  1. 需要在注册模块的时候声明依赖,我这里忘写了,也可以写在最后。
  2. $resource('/article/:id', {id:'@uid'}) 是一个对象,这个对象有许多原型方法,通过这些配置,决定了Store模块会请求这个url /article/:id' ,这个 :id 如果你用过express ,会发现这是一个placeholder,这个placeholder 在哪里使用呢?下边这个uid,就是我们刚才声明的placeholder. 本质是为了在使用原型方法的时候传参。
var user = Store.user.get({uid:123}, function() {
    user.abc = true;
    // 会执行post请求
    user.$save();
    // console.log this user
    console.log(user)
  });
  1. user.abc = true 是在修改拿到数据的值,然后再使用原型方法$save直接POST请求该url提交数据。免除再写回调。
  2. 默认回调是成功时候的状态,失败的情况是最后一个回调(默认是不写的)
var user = Store.user.get({uid:123}, function() {
    user.abc = true;
    // 会执行post请求
    user.$save();
    // console.log this user
    console.log(user)
  },function(err){
     console.log(' request fail !!!! ')
  });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment