2012-07-10 45 views
0

我有一个可重新使用的控件/自定义绑定&模板,该模板旨在基于一组传入的配置选项和最终绑定到页面的ViewModel来构建动态向导。我已经准备好了向导,并且显示了所有必填字段,但到目前为止,我还没有能够显示实际的输入字段值。将ViewModel传递给可重用的Knockout控件

任何想法?

视图模型

var user = function() { 
      var self = this; 
      self.FirstName = ko.observable("Brent"); 
      self.LastName = ko.observable("Pabst"); 
      self.Email = ko.observable("[email protected]"); 
      self.FullName = ko.computed(function() { 
       return self.FirstName() + " " + self.LastName(); 
      }); 
     }; 

     var tenant = function() { 
      var self = this; 

      self.Name = ko.observable("Tenant Name"); 
      self.SubDomain = ko.observable("Sub Domain"); 
      self.User = ko.observableArray([new user]); 

      self.wizardModel = new merlin.wizard({ 
       title: "Add a Tenant", 
       model: self, 
       steps: [ 
        { Title: "Tenant Information", 
         Fields: [ 
          { Name: "Name", Label: "Organization Name", Value: "Name" }, 
          { Name: "SubDomain", Label: "Login Page", Value: "SubDomain" } 
         ] 
        }, 
        { Title: "Administrator Information", 
         Fields: [ 
          { Name: "FirstName", Label: "First Name", Value: "User.FirstName" }, 
          { Name: "LastName", Label: "Last Name", Value: "User.LastName" }, 
          { Name: "Email", Label: "E-Mail Address", Value: "User.Email" } 
         ] 
        } 
       ] 
      }); 

      self.save = function() { 
       alert(ko.toJSON(self)); 
      }; 
     }; 

     ko.applyBindings(tenant()); 

向导模式

merlin.wizard = function (config) { 
    var self = this; 
    self.steps = config.steps; 
    self.title = config.title; 
    self.model = config.model; 
    self.currentStep = ko.observable(0); 
}; 

模板&绑定

var templateEngine = new ko.nativeTemplateEngine(); 

templateEngine.addTemplate = function (templateName, templateMarkup) { 
    document.write("<script type=\"text/html\" id='" + templateName + "'>" + templateMarkup + "<" + "/script>"); 
}; 

templateEngine.addTemplate("merlin_wizard", "\ 
    <form class=\"m-ui-wizard\">\ 
     <h1 data-bind=\"text: title\" />\ 
     <h2 data-bind=\"text: title\" />\ 
     <div class=\"m-ui-wizard-steps\" data-bind=\"foreach: steps\">\ 
      <div class=\"m-ui-wizard-step\">\ 
       <!-- ko if: $data.Fields -->\ 
        <!-- ko foreach: Fields -->\ 
         <label data-bind=\"text: Label, attr: { for: Name }\"></label>\ 
         <input type=\"text\" data-bind=\"attr: { name: Name }, Value: typeof value === 'function' ? Value($root.model) : $root.model[Value]\" />\ 
        <!-- /ko -->\ 
       <!-- /ko -->\ 
      </div>\ 
     </div>\ 
    </form>"); 

ko.bindingHandlers.wizard = { 
    init: function() { 
     return { controlsDescendantBindings: true }; 
    }, 
    update: function (element, viewModelAccessor, allBindingsAccessor) { 
     var viewModel = viewModelAccessor(), allBindings = allBindingsAccessor(); 

     while (element.firstChild) 
      ko.removeNode(element.firstChild); 

     var wizTemplateName = allBindings.gridTemplate || "merlin_wizard"; 

     var wizContainer = element.appendChild(document.createElement("DIV")); 
     ko.renderTemplate(wizTemplateName, viewModel, { templateEngine: templateEngine }, wizContainer, "replaceNode"); 
    } 
}; 

HTML摘录

<div data-bind="wizard: wizardModel"></div> 

注:我一直无法得到这个在小提琴在所有的工作,不知道为什么不是事实,我可能会推小提琴的界限在此设置其它。

+0

我怀疑你是“推小提琴的界限。”当我尝试在小提琴中运行时,我会遇到错误。在淘汰赛中缺少'nodeType'。 – Tyrsius 2012-07-10 19:38:50

+0

@Tyrsius好的,那么任何想法有什么不对? – 2012-07-10 20:05:54

+0

我没有花更多时间在上面。我只是指出你的小提琴失败与你没有什么关系,“推动小提琴的界限”,更多的是与语法错误有关。 – Tyrsius 2012-07-10 23:00:36

回答

1

<input>的值绑定字符串不正确。它应该更像:

value: typeof Value === 'function' ? Value($root.model) : $root.model[Value] 

这里的a fiddle

+0

这非常接近,但子对象“用户”的价值观没有通过你正确的小提琴。任何想法为什么? – 2012-07-11 12:36:03

+0

因为1)'User'是一个observableArray,所以你需要'User()[0] .FirstName'。 2)更重要的是,您只能使用一对括号访问子对象属性。如果Value是“User.FirstName”,那么'$ root.model [Value]'将会是'$ root.model [“User.FirstName”]',但该模型没有名为User.FirstName的属性。你需要分割该字符串,或者找到另一种方法来处理交叉对象引用 – antishok 2012-07-11 19:01:40

+0

很好的答案。谢谢您的帮助。 – 2012-07-11 19:52:47

相关问题