Knockout - asyncCommand - Hans

by hfjallemark

HTML

<link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
<script src="http://github.com/downloads/SteveSanderson/knockout/knockout-2.0.0.js"></script>
<script src="https://github.com/andrewplummer/Sugar/raw/master/release/1.2.4/development/sugar-1.2.4.development.js"></script>
<script src="http://jquery-jsonp.googlecode.com/files/jquery.jsonp-2.3.0.min.js"></script>
<script src="http://neteye.github.com/scripts/jquery.activity-indicator.min.js"></script>
<script src="https://dl.dropbox.com/u/3071586/KO/jquery.activity-ex.js"></script>
<script src="https://dl.dropbox.com/u/3071586/KO/ko.asyncCommand.js"></script>
<script src="https://dl.dropbox.com/u/3071586/KO/ko.bindingHandlers.activity.js"></script>
<script src="https://dl.dropbox.com/u/3071586/KO/ko.bindingHandlers.command.js"></script>
<script src="https://dl.dropbox.com/u/3071586/KO/ko.utils.js"></script>
<script src="http://codeseven.github.com/toastr/toastr-min.js"></script>
<link rel="stylesheet" href="http://codeseven.github.com/toastr/toastr.css">
<!DOCTYPE html>
<html>
     <body>
        <h1>TweetOut</h1>
        
        <p>
            <form class="form-horizontal">
                <div class="control-group">
                    <div class="input-prepend input-append">
                        <span class="add-on">@</span><input
                            class="input-medium"
                            data-bind="value: name, valueUpdate: 'afterkeydown'"
                            type="text"/><button
                            class="btn btn-primary"
                            data-bind="
                                activity: loadTweetsCommand.isExecuting,
                                command: loadTweetsCommand">
                                Load Tweets
                        </button>
                    </div>
                </div>
            </form>
        </p>
         
        <ul data-bind="template: {
            afterAdd:...

SCSS

body {
    padding: 30px;
}

JavaScript

my = {}

my.TwitterService = function() {
    var me = this,
        twitterUrl = 'https://twitter.com/status/user_timeline/{name}.json?count={count}&callback=?'        
    
    me.getTweets = function(options) {
        setTimeout(function() {
            $.jsonp({
                complete: options.complete,
                error: options.error,
                success: options.success,
                url: twitterUrl.assign(options)
            })    
        }, 5000)
        }
    }

my.TweetsViewModel = function() {
    var me = this,
        service = new my.TwitterService()
    
    me.name = ko.observable('hfjallemark')
    me.tweets = ko.observableArray()
    
    me.loadTweetsCommand = ko.asyncCommand({
        execute: function(complete) {
            console.log('Command Executing...')
    
            service.getTweets({
                complete: complete,
                count: 5,
                name: me.name(),
        
                success: function(result) {
                    me.tweets(result)
                    toastr.info(result.length + ' tweets loaded')
                },
        
                error: function(options, status) {
                    toastr.error('An error occured while loading tweets')
                }
            })    
        },
                
        canExecute: function(isExecuting) {
            return !isExecuting && me.name()
        }
    })
}
    
ko.applyBindings(new my.TweetsViewModel())