Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第十一节课问题收集 #23

Open
caihuiji opened this issue Jun 3, 2019 · 2 comments
Open

第十一节课问题收集 #23

caihuiji opened this issue Jun 3, 2019 · 2 comments
Labels

Comments

@caihuiji
Copy link
Contributor

caihuiji commented Jun 3, 2019

课后作业:

  1. mvvm demo 实现
  2. vue 例子开发
@caihuiji caihuiji added the 问题 label Jun 3, 2019
@caihuiji caihuiji changed the title 第十一节课答疑 第十一节课问题收集 Jun 3, 2019
@evilrescuer
Copy link

evilrescuer commented Jun 15, 2019

请问老师,下面这个mvvm demo的例子中:
Object.defineProperty的get方法,怎么直接返回model.text的值 (就是不用另外设置一个变量randomStr,而是直接返回被设置的新的值);如果不写get方法,又会是undefined

<!DOCTYPE html>
<html>
    <div id="container">
        <!-- view 部分 (model.text表示取model.text的数据) -->
        <p id="p" data="{{model.text}}"><p>
    </div>

    <script>
        /** model 部分 **/
        let model = {
            text: '',
        }
        
        // 监听model.text数据变化(重点)
        Object.defineProperty(model, 'text', {
            set: (value) => {
                // model.text变化,新的值是value
                render() // 重新render p 元素 (把Model的数据同步到View显示出来)
            },
            // get: () => model.text    //(死循环)
            get: () => randomStr
        })

        // 模拟数据变化(每秒)
        let randomStr = ''
        setInterval(() => {
            // 设置一个随机数
            randomStr = Math.floor(Math.random() * 10000) + ''
            model.text = randomStr
        }, 1000)

        // DIY 一个render方法:模拟渲染p元素(根据p元素的属性data的模板语法)
        const render = () => {
            const p = document.querySelector('#container p');
            const expression = /\{\{([^{}]*)\}\}/.exec(p.getAttribute('data'))[1];  // model.text
            // 根据模板变量,修改p的文本
            p.innerText = eval(expression);
        }
    </script>
</html>

@caihuiji
Copy link
Contributor Author

(function (model, name , value){
          
        Object.defineProperty(model, name, {
            set: (newValue) => {
                value = newValue;
              
                render() 
                return value;
            },
          
            get: () => {
              return value
            }
        })
      })(model,'text');

Object.defineProperty 改成这个部分,不然一直 mode.text 会进入一直 get 死循环

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants