diff --git a/docs/displaysystem/angular.md b/docs/displaysystem/angular.md
index c8a0ddc1542..c1752dce110 100644
--- a/docs/displaysystem/angular.md
+++ b/docs/displaysystem/angular.md
@@ -96,3 +96,28 @@ z.angularBind("run", 0) will initialize 'run' to zero. And then register watcher
After clicked button, you'll see both 'run' and numWatched are increased by 1
+
+
+
+
+#### Bind/Unbind function
+
+Through ZeppelinContext, you can bind/unbind function to AngularJS view.
+
+Currently it only works in Spark Interpreter (scala).
+
+```
+// bind function in current notebook.
+z.angularBindFunction(String name, { args: Seq[Object] => ... })
+
+// bind function in all notebooks related to current interpreter.
+z.angularBindGlobal(String name, Object object)
+
+// unbind function in current notebook.
+z.angularUnbind(String name)
+
+// unbind function in all notebooks related to current interpreter.
+z.angularUnbindGlobal(String name)
+
+```
+
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java
index 0d2d50c0e21..c9a11f5ea9f 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinContext.java
@@ -24,21 +24,14 @@
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.SQLContext.QueryExecution;
import org.apache.spark.sql.catalyst.expressions.Attribute;
import org.apache.spark.sql.hive.HiveContext;
-import org.apache.zeppelin.display.AngularObject;
-import org.apache.zeppelin.display.AngularObjectRegistry;
-import org.apache.zeppelin.display.AngularObjectWatcher;
-import org.apache.zeppelin.display.GUI;
+import org.apache.zeppelin.display.*;
import org.apache.zeppelin.display.Input.ParamOption;
import org.apache.zeppelin.interpreter.InterpreterContext;
import org.apache.zeppelin.interpreter.InterpreterContextRunner;
@@ -48,6 +41,9 @@
import scala.Tuple2;
import scala.Unit;
import scala.collection.Iterable;
+import scala.collection.JavaConversions;
+import scala.collection.Seq;
+import scala.collection.mutable.Set;
/**
* Spark context for zeppelin.
@@ -749,4 +745,55 @@ private void angularUnbind(String name, String noteId) {
AngularObjectRegistry registry = interpreterContext.getAngularObjectRegistry();
registry.remove(name, noteId);
}
+
+
+ public void angularBindFunction(String name, final scala.Function1, Unit> func) {
+ String noteId = interpreterContext.getNoteId();
+ angularBindFunction(name, noteId, new AngularFunctionRunnable() {
+ @Override
+ public void run(Object... args) {
+ Set